2016-09-21 115 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