SQL 转换问题

SQL Conversion Issue

我有一个临时 table,我在其中将列的所有值创建为逗号分隔列表。我面临的问题是当我输入该 csv 变量时出现错误 例如

Declare @testvar varchar (max)
Select  @testvar = stuff (( select (','''+ cast(var1 as varchar(1024)+'''')
From # Temp for xmlpath('')),1,2,'') from #Temp

Select * from tab1 where col1 in (@testvar)

这是在查询中附加单引号我收到如下错误 将 varchar 值 ''1','2'....... 转换为 int

时转换失败

对此有何建议

你似乎喜欢动态 SQL。确保你的括号完全对应且正确。

set @testvar= stuff( 
(select ',''' + cast(var1 as varchar(1024))+ ''''
From #Temp for xml path(''))
,1,1,'') 


Select * from tab1 where col1 in (@testvar)

sqlfiddle

这是一个示例

CREATE TABLE #Temp(
    var1 INT
);

INSERT INTO #Temp VALUES (1);
INSERT INTO #Temp VALUES (2);

create table tab1(
  col1 int
);

insert into tab1 values (1)
insert into tab1 values (3)

Declare @testvar varchar (max)
Declare @query varchar (max)

set @testvar= stuff( 
(select ',''' + cast(var1 as varchar(1024))+ ''''
From #Temp for xml path(''))
,1,1,'') 


SET @query = 'Select * from tab1 where col1 in ('+@testvar+')'



execute(@QUERY)

IN 运算符需要一个值列表。您为其提供了一个恰好包含逗号分隔文本的值。对于人类来说,差异似乎非常微妙,但对于 SQL Server 来说,这是一个巨大的差异。

类似

的查询
SELECT * FROM Tab1 WHERE Col1 IN ('A', 'B', 'C')

将 return col1 具有值 ABC 的所有行,而查询如

SELECT * FROM Tab1 WHERE Col1 IN ('''A'', ''B'', ''C''')

将 return 只有 col1 具有值 'A', 'B', 'C' 的记录 - 所以基本上就像写

SELECT * FROM Tab1 WHERE Col1 = '''A'', ''B'', ''C'''

你应该做的是直接使用临时 table:

SELECT *
FROM Tab1 
WHERE EXISTS
(
    SELECT 1
    FROM #Temp as tmp
    WHERE tmp.Var1 = Tab1.Col1
)