未能比较两个TSQL变量



我在比较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

最新更新