Sql server varchar到int错误难以理解

Sql server varchar到int错误难以理解,sql-server,tsql,sql-server-2008-r2,Sql Server,Tsql,Sql Server 2008 R2,你好,我正试着这么做 declare @idlist varchar(100) set @idlist = '0,1,2,3,10' select * from CUSTOMERS where ID_CUSTOMER in (@idlist) 我得到了 将varchar值“0,1,2,3,10”转换为时失败 数据类型int 为什么? 我想让它工作,我必须使用上面定义的@IdList。在我的真实案例中,这是一个约束@IdList是我从applicationno传递的一个参数,无论如何,通过这

你好,我正试着这么做

declare @idlist varchar(100)
set @idlist = '0,1,2,3,10'


select * from CUSTOMERS where ID_CUSTOMER in (@idlist)
我得到了

将varchar值“0,1,2,3,10”转换为时失败 数据类型int

为什么?

我想让它工作,我必须使用上面定义的@IdList。在我的真实案例中,这是一个约束@IdList是我从applicationno传递的一个参数,无论如何,通过这个简单的查询,我可以重现这个问题

我找到了一个解决方案

execute ( 'select * from CUSTOMERS WHERE ID_CUSTOMER IN ('+@idlist+')')
但是这迫使我使用EXECUTE,而我得到的转换错误建议我搜索另一个解决方案。

为什么不将您的ID\u客户转换为varchar。试试像这样的东西

从客户中选择*,在@idlist中CASTID_客户为VARCHAR100

尝试以下两种脚本:

将列表存储为表变量

declare @idlist table(id int)
insert @idlist values(0),(1),(2),(3),(10)

select * from CUSTOMERS where ID_CUSTOMER in (select id from @idlist)
将列表转换为逻辑表

declare @idlist varchar(100)
set @idlist = '0,1,2,3,10'

select * from CUSTOMERS where ID_CUSTOMER in (
SELECT t.c.value('.', 'INT')
FROM (
    SELECT x = CAST('<t>' + 
        REPLACE(@idlist, ',', '</t><t>') + '</t>' AS XML)
) a
CROSS APPLY x.nodes('/t') t(c))

这是一个表值函数,我用来将字符串拆分为表。原始资料我找不到,但多年来一直在使用

CREATE FUNCTION [dbo].[fn_String_To_Table] (
        @String VARCHAR(max), /* input string */
 @Delimeter char(1),   /* delimiter */
 @TrimSpace bit )      /* kill whitespace? */
 RETURNS @Table TABLE ( [Val] VARCHAR(4000) )
AS
BEGIN
 DECLARE @Val    VARCHAR(4000)
 WHILE LEN(@String) > 0
  BEGIN
    SET @Val    = LEFT(@String,
         ISNULL(NULLIF(CHARINDEX(@Delimeter, @String) - 1, -1),
         LEN(@String)))
    SET @String = SUBSTRING(@String,
         ISNULL(NULLIF(CHARINDEX(@Delimeter, @String), 0),
         LEN(@String)) + 1, LEN(@String))
 IF @TrimSpace = 1 Set @Val = LTRIM(RTRIM(@Val))
   INSERT INTO @Table ( [Val] )
    VALUES ( @Val )
  END
 RETURN
END
你可以像这样使用它:

select * from CUSTOMERS where ID_CUSTOMER in dbo.fn_String_To_Table (@idlist, ',', 1)

恰好包含数字和逗号序列的单个字符串与作为IN子句参数提供的多个独立数字完全不同。这在SQL中是正确的,就像在您使用过的任何语言中一样。最好的方法是使用一种本机支持存储多个值(如XML或表变量)的数据类型,但如果您坚持使用字符串,请搜索SQL Server split string以获得大量结果。@Damien_不相信您所写的不会让我惊讶。我同意你的看法。促使我提出这个问题的原因是,在过去我记得我做过类似的事情,所以我认为我缺少一个隐藏的tsql功能。因为没有一个整数,从该列转换成字符串,最终会变成0,1,2,3,10,这是IN子句所寻找的唯一值。@Damien_不信者我不理解你的评论,请你重述一遍好吗?顺便说一句,Naila提供的答案似乎就是我要找的诀窍或接近它。@user193655-它编译,是的,它会运行,但它甚至不会生成一行。所以我很困惑为什么你会接受它作为正确的答案我认为他的意思是“0,1,2,3,10”与“0”,“1”,“2”,“3”,“4”不同。我想你是在寻找后者。@Knightwisp-但是如果他们能够指定“0”、“1”、“2”、“3”、“4”,那么他们大概可以很容易地指定0,1,2,3,4,并且一开始就不需要转换成字符串。