SELECT TOP @Variable导致错误: “无效语法”

问题描述:

请参阅下面的TSQL:SELECT TOP @Variable导致错误: “无效语法”

declare @NicheDailyDeletionVolume int 
select @NicheDailyDeletionVolume = NicheDailyDeletionVolume FROM [hq-svr-sql-05].genie2delete.dbo.dbsystem 
declare @tsql as nvarchar(200) 
set @tsql = 'update tbx_rrdgeniestaging set addedtime = dateadd(d,-29,getdate()) where eventid in (
select distinct top '' + @NicheDailyDeletionVolume + '' eventid from tbx_rrdgeniestaging where candelete=getdate())' 
EXECUTE sp_executesql @tsql 

我得到的错误是:近 '+ @NicheDailyDeletionVolume +' 的语法不正确。

我以前却从未与TOP使用这样的变量。

+1

'WHERE candelete = GETDATE()'是极不可能做你想要什么。不清楚是什么数据类型'candelete'是从名字,但是从'GETDATE()'你真的想作为一个查询碰巧被执行与确切时间下降到milisecond仅匹配那些行比较假定日期时间? – 2014-11-14 15:12:22

如加雷斯在他删除答案TOP指出没有ORDER BY是没有意义的反正。

语法上,你可以参数化,并通过它作为一个参数来sp_executesql

DECLARE @NicheDailyDeletionVolume INT 

SELECT @NicheDailyDeletionVolume = NicheDailyDeletionVolume 
FROM [hq-svr-sql-05].genie2delete.dbo.dbsystem 

DECLARE @tsql AS NVARCHAR(200) 

SET @tsql = ' 
UPDATE tbx_rrdgeniestaging 
SET addedtime = dateadd(d, -29, getdate()) 
WHERE eventid IN (SELECT DISTINCT TOP (@NicheDailyDeletionVolume) eventid 
        FROM tbx_rrdgeniestaging 
        WHERE candelete = getdate()) 

      ' 

EXECUTE sp_executesql @tsql, 
         N'@NicheDailyDeletionVolume INT', 
         @[email protected] 

虽然它不是很明显,为什么你需要动态SQL呢。

TOP接受括号中的表达式所以即使以下将工作

UPDATE tbx_rrdgeniestaging 
SET addedtime = dateadd(d, -29, getdate()) 
WHERE eventid IN (SELECT DISTINCT TOP (SELECT NicheDailyDeletionVolume 
             FROM [hq-svr-sql-05].genie2delete.dbo.dbsystem) 
          eventid 
        FROM tbx_rrdgeniestaging 
        WHERE candelete = getdate()) 

但是,如果没有一个ORDER BY并不能保证其eventid您将结束。