2014-09-03 62 views
0

我創建了一個測試存儲過程,用於從視圖中提取所選記錄。我使用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 

我的問題是爲什麼會當程序的創建需要一個被定義的變量被執行時重新聲明,它很重要,我應該在這個p用哪種方法關節病例?

真誠, 安迪

+2

使用Script As Execute時,它將爲您生成參數。通常當你調用一個存儲過程時,你傳遞它的參數,而不是硬編碼的值。另外,請注意您的程序代碼。您正在使用IN而不是=。我擔心你認爲你可以傳遞一個分隔列表作爲參數的值,讓你的程序返回列表。參數不能像那樣工作。 – 2014-09-03 18:45:28

+0

謝謝大家的回答和評論。他們都很有幫助。 – Andy 2014-09-03 18:59:36

回答

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或某種其他應用程序中獲取這些值時,將使用唯一的變量。

因此,您聲明變量並從其他來源傳遞的值中填充它們,並將它們傳遞給此過程。否則功能明智沒有區別。

0

的變量沒有被重新申報,即該存儲過程並不需要這個。查詢窗口要求您在賦值之前聲明變量,再次在此查詢窗口中進行賦值。您可以用實際值替換變量。

EXEC @return_value = [dbo].[andytest] 
     @CpnyID = N'2', 
     @FiscYr = N'2', 
     @LedgerID = N'3', 
     @Acct = N'4'