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使用这样的变量。
答
如加雷斯在他删除答案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
您将结束。
'WHERE candelete = GETDATE()'是极不可能做你想要什么。不清楚是什么数据类型'candelete'是从名字,但是从'GETDATE()'你真的想作为一个查询碰巧被执行与确切时间下降到milisecond仅匹配那些行比较假定日期时间? – 2014-11-14 15:12:22