sql中的动态Where子句,其中包含IN语句

时间:2013-11-08 03:36:51

标签: sql dynamic-sql

如何在SQL中编写查询,其中字符串变量不是''我们包含WHERE子句并检查列表中ID的存在位置?
以下似乎不起作用。

DECLARE @var varchar(20)
DECLARE @clause varchar(20)
DECLARE @sql varchar(20)

SET @var= '1,2,3'
IF @var <> ''
SET @clause=' WHERE ID IN ('+ @var + ')'

SET @sql='SELECT  [ID]
  ,[SOURCE]
  ,[LAST_KEY]
FROM [oms].[dbo].[MIGRATION]' 

EXEC (@sql + @clause)

错误讯息: Msg 156,Level 15,State 1,Line 2 关键字'WHERE'附近的语法不正确。

2 个答案:

答案 0 :(得分:3)

将@sql变量的长度增加到MAX,如

DECLARE @sql varchar(MAX)

您已定义了20个长度,这不足以将整个查询存储在该变量中。同时删除@clause变量并更改您的代码,如下所示。您还可以按print @sql打印整个查询,并检查其中的错误。

DECLARE @var varchar(500)
DECLARE @sql varchar(MAX)

SET @var= '1,2,3'

SET @sql = 'SELECT  [ID], 
                    [SOURCE], 
                    [LAST_KEY] 
            FROM    [oms].[dbo].[MIGRATION]' 

IF @var IS NOT NULL AND @var <> ''
BEGIN
    SET @sql = @sql + ' WHERE ID IN ('+ @var + ')'
END

EXEC (@sql)

答案 1 :(得分:0)

这个问题是因为变量 @sql 的长度。请将它从@sql varchar(20)更改为@sql varchar(max)将解决您的问题。

以下是相同

的代码
  DECLARE @var varchar(20)
DECLARE @clause varchar(20)
DECLARE @sql varchar(max)

SET @var= '1,2,3'
IF @var <> ''
SET @clause=' WHERE ID IN ('+ @var + ')'

SET @sql='SELECT  [ID]
  ,[SOURCE]
  ,[LAST_KEY]
FROM [oms].[dbo].[MIGRATION]' 

EXEC (@sql + @clause)