Tsql 如何消除空值,并使用split delimter插入

Tsql 如何消除空值,并使用split delimter插入,tsql,split,null,Tsql,Split,Null,仅供参考,SplitDelimiterString是一个函数。 -SplitDelimiterString的代码 drop table #temp Create Table #Temp ( col1 Varchar(20), col2 Varchar(20), Col3 Varchar(50), col4 Varchar(20) ) Select * From #Temp Insert Into #Temp(col1) Select * From SplitDelimiterS

仅供参考,SplitDelimiterString是一个函数。 -SplitDelimiterString的代码

drop table #temp

Create Table #Temp 
( 
col1 Varchar(20), 
col2 Varchar(20), 
Col3 Varchar(50), 
col4 Varchar(20)
)

Select * From #Temp 

Insert Into #Temp(col1)
Select * From SplitDelimiterString('123,456', ',')

Insert Into #Temp(col2)
Select * From SplitDelimiterString('abc,def', ',')

Insert Into #Temp(Col3)
Select * From SplitDelimiterString('fff,ggg', ',')

Insert Into #Temp(col4)
Select * From SplitDelimiterString('520002,520003', ',')

Select * From #Temp
-结果集是

Create FUNCTION [dbo].[SplitDelimiterString] (@StringWithDelimiter VARCHAR(8000), @Delimiter VARCHAR(8)) RETURNS @ItemTable TABLE (Item VARCHAR(8000)) AS BEGIN DECLARE @StartingPosition INT; DECLARE @ItemInString VARCHAR(8000); SELECT @StartingPosition = 1; --Return if string is null or empty IF LEN(@StringWithDelimiter) = 0 OR @StringWithDelimiter IS NULL RETURN; WHILE @StartingPosition > 0 BEGIN --Get starting index of delimiter .. If string --doesn't contain any delimiter than it will returl 0 SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); --Get item from string IF @StartingPosition > 0 SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition) ELSE SET @ItemInString = @StringWithDelimiter; --If item isn't empty than add to return table IF( LEN(@ItemInString) > 0) INSERT INTO @ItemTable(Item) VALUES (@ItemInString); --Remove inserted item from string SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition) --Break loop if string is empty IF LEN(@StringWithDelimiter) = 0 BREAK; END RETURN END Col1 Col2 Col3 Col4 123 NULL NULL NULL 456 NULL NULL NULL NULL abc NULL NULL NULL def NULL NULL NULL NULL fff NULL NULL NULL ggg NULL NULL NULL NULL 520002 NULL NULL NULL 520003 -我需要一个像这样的结果集 -结果集是

Create FUNCTION [dbo].[SplitDelimiterString] (@StringWithDelimiter VARCHAR(8000), @Delimiter VARCHAR(8)) RETURNS @ItemTable TABLE (Item VARCHAR(8000)) AS BEGIN DECLARE @StartingPosition INT; DECLARE @ItemInString VARCHAR(8000); SELECT @StartingPosition = 1; --Return if string is null or empty IF LEN(@StringWithDelimiter) = 0 OR @StringWithDelimiter IS NULL RETURN; WHILE @StartingPosition > 0 BEGIN --Get starting index of delimiter .. If string --doesn't contain any delimiter than it will returl 0 SET @StartingPosition = CHARINDEX(@Delimiter,@StringWithDelimiter); --Get item from string IF @StartingPosition > 0 SET @ItemInString = SUBSTRING(@StringWithDelimiter,0,@StartingPosition) ELSE SET @ItemInString = @StringWithDelimiter; --If item isn't empty than add to return table IF( LEN(@ItemInString) > 0) INSERT INTO @ItemTable(Item) VALUES (@ItemInString); --Remove inserted item from string SET @StringWithDelimiter = SUBSTRING(@StringWithDelimiter,@StartingPosition + LEN(@Delimiter),LEN(@StringWithDelimiter) - @StartingPosition) --Break loop if string is empty IF LEN(@StringWithDelimiter) = 0 BREAK; END RETURN END Col1 Col2 Col3 Col4 123 NULL NULL NULL 456 NULL NULL NULL NULL abc NULL NULL NULL def NULL NULL NULL NULL fff NULL NULL NULL ggg NULL NULL NULL NULL 520002 NULL NULL NULL 520003
请帮忙。

-p>--我明白了自己的意思。感谢@liebs19的逻辑

col1 col2 col3 col4 123 abc fff 520002 456 def ggg 520003 -这是我最终要寻找的输出

BEGIN TRAN Create Table #Temp1 ( RowID int not null identity(1,1) primary key, col1 Varchar(20), ) Create Table #Temp2 ( RowID int not null identity(1,1) primary key, col2 Varchar(20), ) Create Table #Temp3 ( RowID int not null identity(1,1) primary key, col3 Varchar(20), ) Create Table #Temp4 ( RowID int not null identity(1,1) primary key, col4 Varchar(20), ) Insert Into #Temp1(col1) Select * From SplitDelimiterString('123,456', ',') Insert Into #Temp2(col2) Select * From SplitDelimiterString('abc,def', ',') Insert Into #Temp3(Col3) Select * From SplitDelimiterString('fff,ggg', ',') Insert Into #Temp4(col4) Select * From SplitDelimiterString('520002,520003', ',') Select #Temp1.Col1, #Temp2.col2, #Temp3.Col3, #Temp4.Col4 From #Temp1 Inner Join #Temp2 ON #Temp1.RowID = #Temp2.RowID Inner Join #Temp3 ON #Temp1.RowID = #Temp3.RowID Inner Join #Temp4 ON #Temp1.RowID = #Temp4.RowID ROLLBACK TRAN
.

问题的定义不明确。该需求中不同列之间的关联是什么?您需要定义这些列之间的关联方式。它只是在分隔字符串中的位置吗?如果是这样,您也可以从函数中返回行号,然后将这些行号合并在一起,生成一条insert语句。@liebs19非常感谢您。。我明白了。@user3605493,很高兴我能为您指出正确的方向。你应该将你的解决方案作为答案发布并接受它,而不是仅仅将其编辑到帖子中。在这个网站上回答你自己的问题是可以的。@liebs19我怎么做?我是这个网站的新手。