您好我正在尝试这样做
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
,而我得到的转换错误则建议我搜索其他解决方案。
答案 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)