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)
这是一个示例
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 具有值 A
、B
或 C
的所有行,而查询如
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
)
我有一个临时 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)
这是一个示例
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 具有值 A
、B
或 C
的所有行,而查询如
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
)