【问题标题】:Trying to use a variable in a SQL WHERE IN statement尝试在 SQL WHERE IN 语句中使用变量
【发布时间】:2020-08-26 20:51:09
【问题描述】:

我正在尝试使用 @List Table 来提供 Where IN 语句。我不断收到错误消息“必须声明标量变量“@List”。

我知道我可以简单地在 WHERE IN 部分中使用 select 语句,但我需要从概念上了解这对于我无法共享整个内容的较大 SQL 语句是否可行。

DECLARE @EarliestDate date Set @EarliestDate = '2020-01-01'

DECLARE @LatestDate date Set @LatestDate = '2020-01-05'

DECLARE @List TABLE(DATAPOINT varchar(20))   


INSERT INTO @List SELECT number1  + CONVERT(varchar(5),number2)  
                                                         
FROM 
                                                         tbl1 
                                                         
INNER JOIN msts tb2 on tbl1.j = tbl2.j and tbl1.s = tbl2.s
                                                        
 INNER JOIN tbl3  on tbl3.r = tbl1.j and tbl3.re = tbl1.s                                                    
                                            
 AND tbl2.date > @EarliestDate
                                                        
 AND tbl2.date < @LatestDate
                                                        

SELECT number3
, number4


FROM table1 ci


WHERE 1=1
AND ci.number1 + CONVERT(varchar(5),ci.number2) IN (**@List**) 

【问题讨论】:

  • 哪一行给出了错误?您是否尝试过替换变量的内容并运行它。
  • 给出错误的行是最后一行,在使用@List 的 WHERE IN 语句处。如果我将@list 替换为INSERT INTO 语句中的内容,我可以成功运行查询,但该解决方案在我的场景中不起作用。我必须从另一台服务器传递信息并将结果转换为不同的数据类型以将其重新输入。另一台服务器没有引用我用来制作列表的表,所以我试图使用一个变量。
  • 也许这样写最后一行?:WHERE 1=1 AND ci.number1 + CONVERT(varchar(5),ci.number2) IN (Select DATAPOINT From @List)
  • 这似乎解决了它。感谢您的快速回复。

标签: sql-server tsql table-variable


【解决方案1】:

要正确使用in(),您必须指定一个查询,而不仅仅是放入您声明并插入数据的表变量。

例子:

DECLARE @EarliestDate date Set @EarliestDate = '2020-01-01'

DECLARE @LatestDate date Set @LatestDate = '2020-01-05'

DECLARE @List TABLE(DATAPOINT varchar(20))   


INSERT INTO @List SELECT number1  + CONVERT(varchar(5),number2)  
                                                         
FROM 
                                                         tbl1 
                                                         
INNER JOIN msts tb2 on tbl1.j = tbl2.j and tbl1.s = tbl2.s
                                                        
 INNER JOIN tbl3  on tbl3.r = tbl1.j and tbl3.re = tbl1.s                                                    
                                            
 AND tbl2.date > @EarliestDate
                                                        
 AND tbl2.date < @LatestDate
                                                        

SELECT number3
, number4


FROM table1 ci


WHERE 1=1
AND ci.number1 + CONVERT(varchar(5),ci.number2) IN (select DATAPOINT from @List) 

【讨论】:

  • 感谢您的意见。这似乎解决了它。
【解决方案2】:

为了完整起见,您还可以使用 CTE 解决此问题 - 有时会更快。我也在这里使用了一个连接,因为它有时也可以让编译器优化。

DECLARE @EarliestDate date Set @EarliestDate = '2020-01-01';

DECLARE @LatestDate date Set @LatestDate = '2020-01-05';

WITH list AS 
(
  SELECT number1  + CONVERT(varchar(5),number2) as DATAPOINT
  FROM tbl1 
  JOIN msts tb2 on tbl1.j = tbl2.j and tbl1.s = tbl2.s
  JOIN tbl3  on tbl3.r = tbl1.j and tbl3.re = tbl1.s                                                    
        AND tbl2.date > @EarliestDate
        AND tbl2.date < @LatestDate
)                  
SELECT number3, number4
FROM table1 ci
JOIN list on ci.number1 + CONVERT(varchar(5),ci.number2) = DATAPOINT ;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-16
    • 2016-05-15
    • 2012-02-19
    • 2014-02-16
    • 2021-12-23
    • 1970-01-01
    • 2012-12-24
    相关资源
    最近更新 更多