我希望使用In查询从列中获取结果集,但是有一些错误转换失败

时间:2017-05-09 19:15:42

标签: sql sql-server

Declare @val varchar(50)='247,254'
Select * from fn_SplitString(@val,'') 
Select UserInfo.UserId from UserInfo where UserId in (Select * from fn_SplitString(@val,''))


fn_SplitString

ALTER FUNCTION [dbo].[fn_SplitString]
(    
      @Input NVARCHAR(MAX),
      @Character CHAR(1)
)
RETURNS @Output TABLE (
      Item NVARCHAR(1000)
)
AS
BEGIN
      DECLARE @StartIndex INT, @EndIndex INT

      SET @StartIndex = 1
      IF SUBSTRING(@Input, LEN(@Input) - 1, LEN(@Input)) <> @Character
      BEGIN
            SET @Input = @Input + @Character
      END

      WHILE CHARINDEX(@Character, @Input) > 0
      BEGIN
            SET @EndIndex = CHARINDEX(@Character, @Input)

            INSERT INTO @Output(Item)
            SELECT SUBSTRING(@Input, @StartIndex, @EndIndex - 1)

            SET @Input = SUBSTRING(@Input, @EndIndex + 1, LEN(@Input))
      END

      RETURN
END
  

错误:将varchar值'247,254'转换为时转换失败   数据类型int。

请帮帮我

3 个答案:

答案 0 :(得分:1)

如果您使用的是SQL Server 2016,则可以使用string_split,如下所示:

Declare @val varchar(50)='247,254'
Select * from fn_SplitString(@val,'') 
Select UserInfo.UserId from UserInfo where UserId in (Select value from string_split(@val, ','))

对于其他版本,您可以创建自定义功能...

答案 1 :(得分:0)

首先,直接在数据上运行您的函数,这样您就可以看到它是如何工作的。这称为测试。

所以,如果你正在运行:

Select * from fn_SplitString(@val, '') ;

然后在结果中查看。你可能会发现你没有提供任何分隔符。

所以试试:

Select * from fn_SplitString(@val, ',') ;

这可能会解决您的问题。

答案 2 :(得分:0)

只需更换&#39;&#39;与&#39;,&#39;你的代码会起作用。 最重要的是,如果您使用SQL Server 2016,则可以使用本机函数String_Split:

 SELECT * FROM STRING_SPLIT('247,254',',') AS SS

这样您就不需要任何用户定义的任务功能。