如何在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'附近的语法不正确。
答案 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)