【问题标题】:SQL Conversion IssueSQL 转换问题
【发布时间】:2018-11-08 08:20:46
【问题描述】:

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

对此有任何建议

【问题讨论】:

  • 您使用的是哪个 dbms?
  • # Temp 语法错误
  • 您需要提供更多信息。至少。请提供确切的错误消息(您写“类似错误”。请复制/粘贴完整消息。还向我们展示#temp 的样子。列名和数据类型。
  • 这是一个错字,它实际上是#Temp 我使用的是 sql server 2014
  • 你为什么不直接做Select * from tab1 where col1 in (select var1 from #Temp)

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


【解决方案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
)

【讨论】:

  • 非常感谢???
  • 很高兴为您提供帮助 :-)
【解决方案2】:

你似乎喜欢做动态 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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-01-10
    • 2017-09-21
    • 2019-08-01
    • 2019-03-07
    • 2021-05-18
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多