我已经创建了一个测试存储过程,用于从视图中提取所选记录。我使用Sql Server Management Studio 2012.我用来创建它的代码是:
create procedure [dbo].[andytest]
@CpnyID char(3)
, @FiscYr char(4)
, @LedgerID char(10)
, @Acct char(10)
as select * From dbo.view_Normal_AcctHist_Leads_AllEntities
where CpnyID in(@CpnyID)
and FiscYr in(@FiscYr)
and LedgerID in(@LedgerID)
and Acct in(@Acct)
执行时我使用:
exec andytest
@CpnyID= '131'
,@FiscYr='2014'
,@LedgerID='Actual'
,@Acct='637100'
我注意到当我将程序编写为'执行'时,来的代码是:
DECLARE @CpnyID char(3)
DECLARE @FiscYr char(4)
DECLARE @LedgerID char(10)
DECLARE @Acct char(10)
-- TODO: Set parameter values here.
set @CpnyID= '131'
set @FiscYr='2014'
set @LedgerID='Actual'
set @Acct='637100'
EXECUTE [dbo].[andytest]
@CpnyID
,@FiscYr
,@LedgerID
,@Acct
我的问题是为什么在创建过程时定义的变量需要在执行时重新声明,并且在这种特殊情况下我应该使用哪种方法?
此致 安迪
答案 0 :(得分:1)
你是否像这样执行......
DECLARE @CpnyID char(3)
DECLARE @FiscYr char(4)
DECLARE @LedgerID char(10)
DECLARE @Acct char(10)
-- TODO: Set parameter values here.
set @CpnyID = '131'
set @FiscYr = '2014'
set @LedgerID = 'Actual'
set @Acct = '637100'
EXECUTE [dbo].[andytest] @CpnyID = @CpnyID
,@FiscYr = @FiscYr
,@LedgerID = @LedgerID
,@Acct = @Acct
或者你直接将值传递给像这样的过程变量......
EXECUTE [dbo].[andytest] @CpnyID = '131'
,@FiscYr = '2014'
,@LedgerID = 'Actual'
,@Acct = '637100'
它没有任何区别,当您从另一个过程或API或某种其他应用程序获取这些值时,使用唯一的变量。
因此,您声明变量并从其他源传递的值填充它们,并将它们传递给此过程。否则功能明智没有区别。
答案 1 :(得分:0)
变量未被重新声明,即存储过程不需要这样做。查询窗口要求您在为此查询窗口分配值之前声明变量。您可以使用实际值替换变量。
EXEC @return_value = [dbo].[andytest]
@CpnyID = N'2',
@FiscYr = N'2',
@LedgerID = N'3',
@Acct = N'4'