我有一个临时表,在该表中,我要将列的所有值创建为逗号分隔的列表。我面临的问题是,当我输入csv变量时,我得到了ex的错误。
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
对此有何建议
发布于 2018-11-08 08:39:50
您似乎喜欢执行动态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)发布于 2018-11-08 09:01:56
IN操作符需要一个值列表。您将为它提供一个包含逗号分隔文本的值。作为一个人,有一个差别似乎非常微妙,但对于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
)https://stackoverflow.com/questions/53203784
复制相似问题