varchar to int错误很难理解

时间:2014-04-11 08:14:53

标签: 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是我从applicatino传递的参数,无论如何,通过这个简单的查询我可以重现这个问题。

我找到了一个使用

的解决方案
execute ( 'select * from CUSTOMERS WHERE ID_CUSTOMER IN ('+@idlist+')')

但这迫使我使用EXECUTE,而我得到的转换错误则建议我搜索其他解决方案。

3 个答案:

答案 0 :(得分:2)

试试这两个脚本:

将列表存储为表变量

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))

答案 1 :(得分:0)

为什么不将 ID_CUSTOMER 投射为varchar。尝试像

这样的东西
  

从CUSTOMERS中选择*,其中CAST(ID_CUSTOMER AS VARCHAR(100))位于(@idlist)

答案 2 :(得分:0)

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

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)