0

如何在 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)

错误消息:消息 156,级别 15,状态 1,行 2 关键字“WHERE”附近的语法不正确。

4

2 回答 2

2

将@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)
于 2013-11-08T04:20:30.923 回答
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)
于 2017-07-20T06:31:07.097 回答