我有一个临时表,在其中将所有列的值创建到逗号分隔的列表中。我面临的问题是当我输入该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
时,转换失败对此有何建议
答案 0 :(得分:1)
您似乎喜欢执行动态SQL。确保所有括号都正确对应。
set @testvar= stuff(
(select ',''' + cast(var1 as varchar(1024))+ ''''
From #Temp for xml path(''))
,1,1,'')
Select * from tab1 where col1 in (@testvar)
这是一个样本
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)
答案 1 :(得分:1)
IN
运算符需要一个值列表。您正在为其提供一个值,该值恰好包含逗号分隔的文本。作为人类,这之间的差异似乎非常微妙,但是对于SQL Server而言,则是巨大的差异。
类似
的查询SELECT * FROM Tab1 WHERE Col1 IN ('A', 'B', 'C')
将返回col1值为A
,B
或C
的所有行,而类似
SELECT * FROM Tab1 WHERE Col1 IN ('''A'', ''B'', ''C''')
将仅返回col1值为'A', 'B', 'C'
的记录-因此,基本上就像写
SELECT * FROM Tab1 WHERE Col1 = '''A'', ''B'', ''C'''
您应该直接使用临时表:
SELECT *
FROM Tab1
WHERE EXISTS
(
SELECT 1
FROM #Temp as tmp
WHERE tmp.Var1 = Tab1.Col1
)