必须声明标量变量@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的主要内容,如果未能解决你的问题,请参考以下文章