2016-09-21 118 views
0
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

+0

您还没有一个值分配给'@ nRuleId' – Takarii

+0

''sp_executesql的一个希望SQL语句作为第一个参数,则params排第二,你的'@ strRuleQuery' contans的变量'@ nRuleId'which未声明为parmeter并且未分配,但是您声明了分配了“@ FIPSName”的参数,但已分配但不需要 –

+0

您是否检查过给出的任何答案? – gofr1

回答

0

您必须重写执行部分:

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

我不明白,为什么你传递@FIPSName作为参数,它不是在您的批量使用。

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