必须声明标量变量@nRuleId

Posted

技术标签:

【中文标题】必须声明标量变量@nRuleId【英文标题】:Must Declare Scalar variable @nRuleId 【发布时间】:2016-09-21 11:10:02 【问题描述】:
USE GDMDBNS_1720
GO

IF EXISTS(SELECT * FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_TYPE = 'PROCEDURE'
        AND ROUTINE_SCHEMA = 'dbo' AND ROUTINE_NAME = 'usp_RmsExecuteValidationRule')
BEGIN
    DROP PROCEDURE dbo.usp_RmsExecuteValidationRule
END
GO

Create PROCEDURE [dbo].[usp_RmsExecuteValidationRule]
     @nRuleId INT,
     @FIPSName VARCHAR(5)
AS
BEGIN

    DECLARE @strRuleQuery VARCHAR(MAX)
    DECLARE @sqlstat AS NVARCHAR(MAX)
    DECLARE @params  AS NVARCHAR(MAX)
    SET @strRuleQuery = N'SELECT RULE_QUERY from GdmValidationRuleMaster where
    RULE_ID = @nRuleId'

    SET @sqlstat = @strRuleQuery

    SET @params = N'@FIPSName VARCHAR(5)'
    EXEC sp_executesql @params,
        @query = @sqlstat,
        @FIPSName = @FIPSName

END

调试必须声明标量变量 @nRuleId 时出错。我已经宣布了。但是错误总是会出现。

【问题讨论】:

你还没有给@nRuleId赋值 sp_executesql 想要一个 sql 语句作为第一个参数,params 排在第二位,你的@strRuleQuery 包含一个变量@nRuleId,它没有被声明为参数并且没有被赋值,但是你声明了一个参数@FIPSName已分配但不需要 你检查过任何给出的答案吗? 【参考方案1】:

代码似乎存在许多问题。

要返回一个值,你需要声明一个OUTPUT参数,变量@FIPSName在代码中并没有实际使用,@strRuleQuery在这段代码中是多余的。

这是来自 SProc 内部的代码,应该更接近您的需求。

-- Parameters
DECLARE
@nRuleId INT = 1,
 @FIPSName VARCHAR(5) = 'ITS'

-- Local variables
DECLARE @sqlstat AS NVARCHAR(MAX)
DECLARE @params  AS NVARCHAR(MAX)
DECLARE @RULE_QUERY NVARCHAR(MAX)

SET @sqlstat = N'SELECT @RULE_QUERY=RULE_QUERY from GdmValidationRuleMaster where RULE_ID = @nRuleId'

SET @params = N'@nRuleId INT, @RULE_QUERY NVARCHAR(MAX) OUTPUT'
EXEC sp_executesql 
    @sqlstat,
    @params,
    @nRuleId = @nRuleId, @RULE_QUERY= @RULE_QUERY OUTPUT

-- Output
SELECT @RULE_QUERY

【讨论】:

【参考方案2】:

你必须重写执行部分:

SET @params = N'@FIPSName VARCHAR(5), @nRuleId int'
EXEC sp_executesql  @strRuleQuery, @params, @FIPSName = @FIPSName, @nRuleId = @nRuleId

我不明白,你为什么要传递@FIPSName作为参数,它没有在你的批处理中使用。

【讨论】:

以上是关于必须声明标量变量@nRuleId的主要内容,如果未能解决你的问题,请参考以下文章

必须声明标量变量@Id?

表变量和错误“必须声明标量变量”

不正确的语法必须声明标量变量

例外 |必须声明标量变量@IdAlbum

查询“必须声明标量变量”

Dapper:必须在 Select 命令中声明标量变量