我与SQL Server的工作,我已经成功地转换表的行成逗号分隔值,现在我要以逗号分隔值的该字符串转换回表的行。逗号分隔的字符串到表的列在SQL Server
我有这个字符串(Varchar
)
DECLARE @str AS varchar(Max)
SET @str = '0.00,0.00,1576.95,0.00,4105.88,1017.87,0.00,6700.70'
我想这些值代入行。
像
0.00
0.00
1576
...
我与SQL Server的工作,我已经成功地转换表的行成逗号分隔值,现在我要以逗号分隔值的该字符串转换回表的行。逗号分隔的字符串到表的列在SQL Server
我有这个字符串(Varchar
)
DECLARE @str AS varchar(Max)
SET @str = '0.00,0.00,1576.95,0.00,4105.88,1017.87,0.00,6700.70'
我想这些值代入行。
像
0.00
0.00
1576
...
创建一个函数:
CREATE FUNCTION [dbo].[Split](@String nvarchar(4000), @Delimiter char(1))
RETURNS @Results TABLE (Items nvarchar(4000))
AS
BEGIN
DECLARE @Index INT
DECLARE @Slice nvarchar(4000)
-- HAVE TO SET TO 1 SO IT DOESN’T EQUAL ZERO FIRST TIME IN LOOP
SELECT @Index = 1
WHILE @Index !=0
BEGIN
SELECT @Index = CHARINDEX(@Delimiter,@String) --Getting the indexof the first Occurrence of the delimiter
-- Saving everything to the left of the delimiter to the variable SLICE
IF @Index !=0
SELECT @Slice = LEFT(@String,@Index - 1)
ELSE
SELECT @Slice = @String
-- Inserting the value of Slice into the Results SET
INSERT INTO @Results(Items) VALUES(@Slice)
--Remove the Slice value from Main String
SELECT @String = RIGHT(@String,LEN(@String) - @Index)
-- Break if Main String is empty
IF LEN(@String) = 0 BREAK
END
RETURN
END
传递字符串@str
和分隔符(,)的功能。
SELECT Items FROM [dbo].[Split] (@str, ',')
它会返回结果为表:
Items
0.00
0.00
1576.95
0.00
4105.88
1017.87
0.00
6700.70
请不要使用WHILE循环分割功能。这是非常低效的。有几个更好的选择。无论如何,这个问题是重复的,我会在此时发布链接。 –
试试这个功能
CREATE FUNCTION UF_CSVToTable_new(@psCSString VARCHAR(8000))
RETURNS @otTemp TABLE(sID VARCHAR(20))
AS
BEGIN
DECLARE @sTemp VARCHAR(10)
WHILE LEN(@psCSString) > 0
BEGIN
SET @sTemp = LEFT(@psCSString, ISNULL(NULLIF(CHARINDEX(',', @psCSString) - 1, -1),
LEN(@psCSString)))
SET @psCSString = SUBSTRING(@psCSString,ISNULL(NULLIF(CHARINDEX(',', @psCSString), 0),
LEN(@psCSString)) + 1, LEN(@psCSString))
INSERT INTO @otTemp VALUES (@sTemp)
END
RETURN
END
使用
DECLARE @str AS varchar(Max)
SET @str = '0.00,0.00,1576.95,0.00,4105.88,1017.87,0.00,6700.70'
SELECT * FROM UF_CSVToTable_new(@str)
结果
请不要使用WHILE循环分割功能。这是非常低效的。这个功能只适用于非常小的列表,但不能很好地扩展。很多人在T-SQL中进行了很多测试,并且我的答案中提到了三种已知正常工作的方法。 –
这个问题是少数人的副本,但一些接受的答案仍然是低效的WHILE循环或递归的CTE。有三种方式来完成拆分,不会杀死性能:
号/理货表: http://www.sqlservercentral.com/articles/Tally+Table/72993/(免费 需要注册)
XML: https://www.simple-talk.com/blogs/2012/01/05/using-xml-to-pass-lists-as-parameters-in-sql-server/
SQLCLR :在很多网站上有很多这样的例子,但是最好的(也是最简单的)赌注是抓取 中的数字/理货表文章指出上面或只是安装SQL# (SQLsharp)(我是SQL#的作者,但String_Split和String_Split4k在 免费版)。
可能重复[如何分割/逗号分隔的字符串场爆炸成SQL查询](http://stackoverflow.com/questions/19334380/how-to-split-explode-comma-delimited-string-现场为-SQL查询) –
重复http://stackoverflow.com/questions/2647/split-string-in-sql,但对于一个选择的答案仍然使用低效的一段时间。 –