用存储过程,@num小于字段中包含@split的个数时自行处理一下
CREATE TABLE sourTa(colname varchar(20))
INSERT INTO sourTa SELECT '1,2,3,4,5'
UNION ALL SELECT '1,2,3'
go
CREATE PROC GetCol(
@col varchar(10),
@sp varchar(10),
@i int
)
AS
SET NOCOUNT ON
DECLARE @s int
DECLARE @str varchar(1000)
IF object_id('aixTa') IS NOT NULL
DROP TABLE aixTa
SET @str='CREATE TABLE aixTa('
SET @s=1
WHILE @s<=@i
BEGIN
SET @str = @str+@col+cast(@s AS varchar)+' varchar(10),'
SET @s = @s+1
END
SET @str = LEFT(@str,len(@str)-1)+')'
EXEC (@str)
SELECT colname+replicate(',null',@i-l-1 ) colname INTO #
FROM (
SELECT colname,
len(colname)-len(replace(colname,@sp,'')) l
FROM sourTa
) st
EXEC master..xp_execresultset 'select ''insert aixTa SELECT ''+colname from #',N'test'
SELECT * FROM aixTa
DROP TABLE #
go
EXEC GetCol 'col',',',6
--result
/*col1 col2 col3 col4 col5 col6
---------- ---------- ---------- ---------- ---------- ----------
1 2 3 4 5 NULL
1 2 3 NULL NULL NULL
*/
这个问题第7个回答:
为什么提示 ’master..xp_execresultset ’ 存储过程不存在
这个问题第8个回答:
up
这个问题第9个回答:
因为本来就没有这个东西.
这个问题第10个回答:
SQL code
--> 测试数据: @s
declare @s table (colname varchar(50))
insert into @s
select '1,2,3,4,5' union all
select '1,2,3'
create proc p_p
@colname varchar(500),
@num int
as
declare @sql varchar(1000)
if object_id('pp') is null
begin
declare @i int
SET @i=1
WHILE @i<=@num
BEGIN
SET @sql = isnull(@sql+',','create table pp(')+'col'+ltrim(@i)+' varchar(10)'
SET @i = @i+1
END
set @sql=@sql+')'
end
set @colname=@colname+replicate(',',@num-len(@colname)+len(replace(@colname,',','')))
while(charindex(',,',@colname)>0)
set @colname=replace(@colname,',,',','''',')
set @sql=isnull(@sql,'')+' insert into pp select '+left(@colname,len(@colname)-1)
exec(@sql)
select * from pp
go
exec p_p '1,2,3,4,5',10
exec p_p '1,2,3',10