必须声明标量变量@nRuleId

时间:2016-09-21 11:10:03

标签: sql-server

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

得到错误,而Debugging必须声明标量变量@nRuleId。我已经宣布了。但是错误总是存在。

2 个答案:

答案 0 :(得分:0)

您必须重写执行部分:

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

我不明白,为什么你通过@FIPSName作为参数,它不会在你的批次中使用。

答案 1 :(得分:0)

代码似乎存在许多问题。

要返回一个值,您需要声明一个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