2016-11-22 47 views
0

我有一個需要增強的存儲過程。這是我現在擁有的。if transact sql

ALTER PROCEDURE [rw].[sp_EFT_NoticeXLS2] 
    (@Scope varchar(50) 
    , @AcctPeriod char(6) 
    , @CompanyID nchar(10)) 
AS ...... 

我需要做的是一個變量@GLsubacct傳遞給它只有@CompanyID是0000

我試過.....

ALTER PROCEDURE [rw].[sp_EFT_NoticeXLS2] 
    (@Scope varchar(50) 
    , @AcctPeriod char(6) 
    , @CompanyID nchar(10) 
    IF (@CompanyID IS 0000) 
    @GLsubacct varchar(1000)) 
AS .... 

但我正在逐漸一個錯誤。我不知道如何編寫if語句。我需要所有的幫助,謝謝!

+0

您不能有條件地接受參數。您可以通過將它們分配爲默認值來使其成爲可選項。任何有條件的操作都將在存儲過程中完成,而不是其參數列表。 – Santi

回答

1

你不能那樣做。

你可以設置第二個變量爲「可空」......使其成爲「可選」。

然後,如果規則不遵循,則可以引發異常。

通用示例:

Use Northwind 
GO 


IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[uspDoSomething]') AND type in (N'P', N'PC')) 
    DROP PROCEDURE [dbo].[uspDoSomething] 
GO 

CREATE PROCEDURE [dbo].[uspDoSomething] 
(
    @CustomerId varchar(12) 
    , @PostalCode varchar(12) = NULL 
) 
AS 

SET NOCOUNT ON; 

if @CustomerId = 'ALFKI' AND @PostalCode IS NULL 
BEGIN 
    THROW 51000, 'You must supply a Postal Code with this @CustomerId.', 1; 
END 


select * from dbo.Customers c 
where 
c.CustomerID = @CustomerId 
AND 
(@PostalCode IS NULL OR c.PostalCode = @PostalCode) 


GO 
/* examples */ 

exec [dbo].[uspDoSomething] 'ALFKI' , '12209' 

exec [dbo].[uspDoSomething] 'ALFKI' 

exec [dbo].[uspDoSomething] 'ANATR' , '05021' 
+0

謝謝你們!這解決了我的困境! – Tetteh

+0

禮節::如果此答案可幫助您解決您的問題(或其他答案),請將其標記爲「答案」,並提出有用答案(任何)。 – granadaCoder

+0

我該怎麼做?我之前曾問過這個問題? – Tetteh

0

你可能並不需要使用下面這取決於IF聲明你的存儲過程實際上確實,但你正在尋找的可能是這樣的:

ALTER PROCEDURE [rw].[sp_EFT_NoticeXLS2] 
    @Scope varchar(50), 
    @AcctPeriod char(6), 
    @CompanyID nchar(10), 
    @GLsubacct varchar(1000) = NULL 
AS 
BEGIN 
    IF @CompanyID = '0000' 
    BEGIN 

     -- CompanyID is 0000 

    END 
    ELSE 
    BEGIN 

     -- CompanyID is NOT 0000 

    END 
END 
GO