我有一个SQL Server2008 R2列,其中包含一个需要用逗号分隔的字符串。我在StackOverflow上看到了很多答案,但没有一个在R2中有效。我已经确保我对任何拆分函数示例都有select权限。非常感谢您的帮助。
发布于 2012-06-06 20:52:24
我以前用过这个SQL,它可能对你有用:
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE CHARINDEX(',', @stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
INSERT INTO @returnList
SELECT @stringToSplit
RETURN
END
并使用它:
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
发布于 2012-11-09 03:31:39
如果您替换
WHILE CHARINDEX(',', @stringToSplit) > 0
使用
WHILE LEN(@stringToSplit) > 0
您可以删除while循环之后的最后一个插入语句!
CREATE FUNCTION dbo.splitstring ( @stringToSplit VARCHAR(MAX) )
RETURNS
@returnList TABLE ([Name] [nvarchar] (500))
AS
BEGIN
DECLARE @name NVARCHAR(255)
DECLARE @pos INT
WHILE LEN(@stringToSplit) > 0
BEGIN
SELECT @pos = CHARINDEX(',', @stringToSplit)
if @pos = 0
SELECT @pos = LEN(@stringToSplit)
SELECT @name = SUBSTRING(@stringToSplit, 1, @pos-1)
INSERT INTO @returnList
SELECT @name
SELECT @stringToSplit = SUBSTRING(@stringToSplit, @pos+1, LEN(@stringToSplit)-@pos)
END
RETURN
END
发布于 2017-01-29 22:32:49
所有使用某种循环(迭代)的字符串拆分函数的性能都很差。它们应该被基于集合的解决方案所取代。
这段代码执行得非常好。
CREATE FUNCTION dbo.SplitStrings
(
@List NVARCHAR(MAX),
@Delimiter NVARCHAR(255)
)
RETURNS TABLE
WITH SCHEMABINDING
AS
RETURN
(
SELECT Item = y.i.value('(./text())[1]', 'nvarchar(4000)')
FROM
(
SELECT x = CONVERT(XML, '<i>'
+ REPLACE(@List, @Delimiter, '</i><i>')
+ '</i>').query('.')
) AS a CROSS APPLY x.nodes('i') AS y(i)
);
GO
https://stackoverflow.com/questions/10914576
复制相似问题