以下是我的假设,
1.您使用','作为分隔符。
2.你不关心性能,因为你在一列中插入所有内容
下面会有帮助吗?
/*create table
CREATE TABLE Tbl (col nvarchar(max))
insert into Tbl values ('1,2,3,4'),('1,2,3'),('1,2')
***/
DECLARE @maxcol as int,@i as int
SELECT @maxcol=max(LEN(col) - LEN(REPLACE(col, ',', '')))+1 FROM Tbl
select @i=1
declare @nvarsql as nvarchar(max)
select @nvarsql =''
while @i<[email protected]
begin
set @nvarsql = @nvarsql + ' ISNULL(DBO.fnString_DelimeterIndex(col,'','',' + cast(@i as varchar) +'),'''') as COL' + CAST(@i AS VARCHAR) + ','
set @i = @i +1
end
if @nvarsql <>''
begin
set @nvarsql = 'SELECT ' + left(@nvarsql,LEN(@nvarsql)-1) + ' FROM Tbl'
end
PRINT @nvarsql
EXEC (@nvarsql)
从某处
ALTER FUNCTION [dbo].[fnString_DelimeterIndex]
(
@Text NVARCHAR(4000),
@Delimiter CHAR,
@Section SMALLINT
)
RETURNS NVARCHAR(4000)
AS
BEGIN
DECLARE @NextPos SMALLINT,
@LastPos SMALLINT,
@Found SMALLINT,
@REVERSE BIT
IF @Section < 0
SELECT @Text = REVERSE(@Text)--, @Section=1,@REVERSE=1
SELECT @NextPos = CHARINDEX(@Delimiter, @Text, 1),
@LastPos = 0,
@Found = 1
WHILE @NextPos > 0 AND ABS(@Section) <> @Found
SELECT @LastPos = @NextPos,
@NextPos = CHARINDEX(@Delimiter, @Text, @NextPos + 1),
@Found = @Found + 1
RETURN CASE
WHEN @Found <> ABS(@Section) OR @Section = 0 THEN NULL
--WHEN @REVERSE =1 THEN
WHEN @Section > 0 THEN SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END)
ELSE REVERSE(SUBSTRING(@Text, @LastPos + 1, CASE WHEN @NextPos = 0 THEN DATALENGTH(@Text) - @LastPos ELSE @NextPos - @LastPos - 1 END))
END
END
结果从上面的例子
COL1 COL2 COL3 COL4
1 2 3 4
1 2 3
1 2
不知道wheter我理解你的querstion正确的标量函数下载...但geany(HTTP:// geany。 org)将tableconvert作为插件提供,可以将制表符分隔的内容转换为可插入的vlaue列表。 – frlan