首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >T-SQL拆分字符串

T-SQL拆分字符串
EN

Stack Overflow用户
提问于 2012-06-06 20:50:52
回答 18查看 534.6K关注 0票数 157

我有一个SQL Server2008 R2列,其中包含一个需要用逗号分隔的字符串。我在StackOverflow上看到了很多答案,但没有一个在R2中有效。我已经确保我对任何拆分函数示例都有select权限。非常感谢您的帮助。

EN

回答 18

Stack Overflow用户

回答已采纳

发布于 2012-06-06 20:52:24

我以前用过这个SQL,它可能对你有用:

代码语言:javascript
复制
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

并使用它:

代码语言:javascript
复制
SELECT * FROM dbo.splitstring('91,12,65,78,56,789')
票数 266
EN

Stack Overflow用户

发布于 2012-11-09 03:31:39

如果您替换

代码语言:javascript
复制
WHILE CHARINDEX(',', @stringToSplit) > 0

使用

代码语言:javascript
复制
WHILE LEN(@stringToSplit) > 0

您可以删除while循环之后的最后一个插入语句!

代码语言:javascript
复制
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
票数 7
EN

Stack Overflow用户

发布于 2017-01-29 22:32:49

所有使用某种循环(迭代)的字符串拆分函数的性能都很差。它们应该被基于集合的解决方案所取代。

这段代码执行得非常好。

代码语言:javascript
复制
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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10914576

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档