我在比较TSQL中的两个变量时遇到了一点问题。
下面是代码
SET ANSI_NULLS ON
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sspUpdateActivityDate] (
@e nvarchar(15),
@i nvarchar(11),
@c nvarchar(50),
@u nvarchar(50)
)
AS
BEGIN
DECLARE @var_Count int
DECLARE @var_RecordLimit int
SET @var_RecordLimit = 20
SELECT @var_Count = COUNT(*) FROM tblLastAccess WHERE employeeID = @e
IF @var_Count > @var_RecordLimit
BEGIN
DELETE FROM tblLastAccess
WHERE lastDate NOT IN (
SELECT TOP @var_RecordLimit lastDate
FROM tblLastAccess
WHERE employeeID = @e
ORDER BY lastDate DESC
)
END
INSERT INTO tblLastAccess(employeeID, ip, computerName, username) VALUES (@e, @i, @c, @u)
END
错误说
Msg 102,级别15,状态1,过程sspUpdateActivityDate,第19行
"@var_RecordLimit"附近语法错误。
@var_Count和@var_RecordLimit(据我所知)比较后的点
这个想法是添加记录,但动态地限制记录计数,我最初设置为20。IF内的代码块用于删除TOP n值旁边的记录。
我用的是SQL Server 2000。
请指引我。
这是为了更新的目的,顺便说一下,这就是为什么我使用ALTER而不是CREATE
不能这样使用TOP
子句中的变量;你必须用一个常数。您通常会使用动态SQL来执行此类操作,其中您的查询依赖于示例中的变量值。所以,你可以这样做:
DECLARE @SQL NVARCHAR(1000)
SET @SQL = 'DELETE FROM tblLastAccess WHERE lastDate NOT IN ('
+'SELECT TOP'
+ cast(@var_RecordLimit as varchar)
+ ' lastDate FROM tblLastAccess WHERE employeeID = @empID ORDER BY lastDate DESC)'
EXECUTE sp_executesql @SQL, N'@empID nvarchar(15)', @e
注意,由于@e
是一个输入参数,它将动态查询开放给SQL注入,因此我们将其替换为动态查询中的另一个参数@empID
,然后在执行时传递实际值
只要把变量括起来就行了
SELECT TOP (@var_RecordLimit) lastDate
FROM tblLastAccess
WHERE employeeID = @e
ORDER BY lastDate DESC