2

我有一个功能:


ALTER FUNCTION [dbo].[func_ParseString] (@list nvarchar(MAX))
   RETURNS @tbl TABLE (string VARCHAR(500) NOT NULL) AS
BEGIN
   DECLARE @pos        int,
           @nextpos    int,
           @valuelen   int

   SELECT @pos = 0, @nextpos = 1

   WHILE @nextpos > 0
   BEGIN
      SELECT @nextpos = charindex(', ', @list, @pos + 1)
      SELECT @valuelen = CASE WHEN @nextpos > 0
                              THEN @nextpos
                              ELSE len(@list) + 1
                         END - @pos - 1
      INSERT @tbl (string)
         VALUES (substring(@list, @pos + 1, @valuelen))
      SELECT @pos = @nextpos
   END
  RETURN
END

我有一张桌子

ID 姓名 年龄
1 20
2 克里斯 30
3 安迪 20

当我尝试 select in 语句时,它只返回逗号分隔字符串中名字的所有值

SELECT * FROM table  
WHERE name IN (SELECT string COLLATE DATABASE_DEFAULT FROM [dbo].[func_ParseString]('Dan, Andy')

当我想返回第 1 行和第 3 行时,这只返回第 1 行

有人可以帮忙吗?

4

3 回答 3

3

您的函数在 Andy 前面返回一个前导空白。

您应该使用LTRIM功能将其删除。在函数中,在插入@tbl 时:

 INSERT @tbl (string)
         VALUES (LTRIM (substring(@list, @pos + 1, @valuelen)))

或者当你调用函数时:

SELECT LTRIM(string) FROM [dbo].[func_ParseString] ('Dan, Andy')
于 2013-07-09T09:02:08.347 回答
0

我不记得我在哪里找到了这个功能。我实现了它并且效果很好

ALTER FUNCTION [dbo].[StringSplit]
(
  @delimited nvarchar(max),
  @delimiter nvarchar(100)
) RETURNS @t TABLE
(
-- Id column can be commented out, not required for sql splitting string
  id int identity(1,1), -- I use this column for numbering splitted parts
  val nvarchar(max)
)
AS
BEGIN
  declare @xml xml
  set @xml = N'<root><r>' + replace(@delimited,@delimiter,'</r><r>') + '</r></root>'

  insert into @t(val)
  select 
    r.value('.','varchar(max)') as item
  from @xml.nodes('//root/r') as records(r)

  RETURN
END

GO

DECLARE @String NVARCHAR(max)
SET @String = 'Dan, Andy'

SELECT Val FROM [dbo].[StringSplit] (@String, ',')  
于 2013-07-09T09:02:49.557 回答
0

STRING_SPLIT 在 SQL Server 2016 中可用。

于 2016-03-08T22:01:27.977 回答