2016-11-22 52 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