拆分字符串仅返回第一个值

时间:2018-12-28 16:57:19

标签: sql-server database sql-server-2012

由于某些原因,我的分割字符串代码仅返回第一个值。我无法弄清楚,因此将不胜感激。我正在使用以下内容。

declare @CYEnd varchar(4) = '2015, 2016, 2017'
SELECT * FROM vwRMSGrantsSpending
WHERE CYEnd IN (select ltrim(item) from dbo.SplitStringList(@CYEnd, ','))

应该返回2015、2016和2017。但是仅返回2015。

这里是dbo.SplitStringList

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[SplitStringList](@ListString nvarchar(max), @delim 
varchar(2) = ',')
returns @vals table (Item nvarchar(60))
as 
begin
  declare @CurLoc int, @Item nvarchar(60)
  while len(@ListString) > 0
  begin
    set @CurLoc = charindex(@delim, @ListString, 1)
    if @CurLoc = 0
      begin
        set @Item = @ListString
              set @Item = Ltrim(RTrim(@Item))
        set @ListString = ''
      end
    else
      begin
        set @Item = left(@ListString, @CurLoc - 1)
              set @Item = Ltrim(RTrim(@Item))
        set @ListString = substring(@ListString, @CurLoc + 1, 
Len(@ListString) - @CurLoc)
      end
    insert into @vals (Item) values (@Item)  
    end
    return
end

1 个答案:

答案 0 :(得分:2)

问题是您定义的varchar太小。

declare @CYEnd varchar(4) = '2015, 2016, 2017'

如果在声明后运行此PRINT @CYEnd,您将看到变量仅等于2015

增大该变量,使其起作用。