SQL转换问题

时间:2018-11-08 08:20:46

标签: sql sql-server tsql sql-server-2014

我有一个临时表,在其中将所有列的值创建到逗号分隔的列表中。我面临的问题是当我输入该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

时,转换失败

对此有何建议

2 个答案:

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

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)

答案 1 :(得分:1)

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

类似

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

将返回col1值为ABC的所有行,而类似

的查询
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
)