【问题标题】:Failed to compare two TSQL variables无法比较两个 TSQL 变量
【发布时间】:2014-09-05 03:32:29
【问题描述】:

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

错误提示

消息 102,级别 15,状态 1,过程 sspUpdateActivityDate,第 19 行
'@var_RecordLimit' 附近的语法不正确。

@var_Count 和@var_RecordLimit 比较后的哪些点(据我了解)

想法是添加记录但动态限制记录数,我最初设置为 20。IF 内的代码块是删除 TOP n 旁边的记录strong> 价值观。

顺便说一下,我使用的是 SQL Server 2000。

请指导我。

顺便说一句,这是为了更新,这就是我使用 ALTER 而不是 CREATE 的原因

【问题讨论】:

  • 只是为了好奇,如果你用括号括住那个变量,比如TOP(@var_RecordLimit)

标签: sql tsql sql-server-2000


【解决方案1】:

您不能以这种方式在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(@1)...'然后带参数做sp_executesql,避免sql注入?
  • 我不确定是否有必要,因为变量是存储过程的内部变量,并且还分配了一个预设值。
  • 是的。 @e 呢? - 它是一个字符串
【解决方案2】:

只需将变量括在括号中即可正常工作

SELECT TOP (@var_RecordLimit) lastDate
FROM tblLastAccess
WHERE employeeID = @e
ORDER BY lastDate DESC

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    相关资源
    最近更新 更多