2014-03-04 51 views
3

我想創建與存儲過程if/else語句,這將導致一個文本消息,如果輸入到存儲過程中的錯誤的客戶ID。現在,只有在CustomeID中沒有輸入內容時,它纔會給我一個打印行。編寫存儲過程的if/else創建錯誤消息

Create proc spCustOrder 
@CustomerID VarChar(10), 
@StartDate SmallDateTime = null, 
@EndDate SmallDateTime = NUll 
as 
Begin 
iF @CustomerID > 0 

Select Distinct OrderID, OrderDate 
from Customer C join CustOrder CO on CO.CustomerID = C.CustomerID 
where C.CustomerID = @CustomerID and 
OrderDate >= Isnull(@startDate,'1900-01-01') and 
OrderDate <= IsNull(@EndDate, getDate()) 
Else 
Print 'Please enter a CustomerID' 
end 

基本上我是不明確的是,我應該用什麼來代替「0」,在這個「@CustomerID> 0」,以使程序的功能。我嘗試使用CustomerID或C.和CO.CustomerID,但它說使用該命令時出現錯誤。

回答

2

嘗試

IF Exists(
    SELECT DISTINCT OrderID, ... 
    ) 
ELSE 
    PRINT ... 
END 

而且,你通常需要從存儲過程返回的ID或真/假值,並做調用PROC例行任何印刷或IO;避免在proc本身中進行IO操作。

0

嘗試IS NULL

Create proc spCustOrder 
    @CustomerID VarChar(10), 
    @StartDate SmallDateTime = null, 
    @EndDate SmallDateTime = NUll 
    as 
    Begin 
    iF (@CustomerID IS NULL) 
    Select Distinct OrderID, OrderDate 
    from Customer C join CustOrder CO on CO.CustomerID = C.CustomerID 
    where C.CustomerID = @CustomerID and 
    OrderDate >= Isnull(@startDate,'1900-01-01') and 
    OrderDate <= IsNull(@EndDate, getDate()) 
    Else 
    Print 'Please enter a CustomerID' 
    end 
2

我已經使用SQL Server的RAISERROR功能,如果用戶犯規傳遞客戶ID拋出一個錯誤。

RETURN關鍵字將停止代碼執行並退出,在RETURN關鍵字後不再執行任何代碼。即如果爲@CustomerID值是空值或0和控制進入IF Block

Create proc spCustOrder 
@CustomerID VarChar(10) = NULL, 
@StartDate SmallDateTime = null, 
@EndDate SmallDateTime = NUll 
AS 
BEGIN 
    SET NOCOUNT ON; 

    IF (@CustomerID IS NULL OR @CustomerID = 0) 
    BEGIN 
    RAISERROR('Please enter a CustomerID',16,1) 
    RETURN; 
    END 

    Select Distinct OrderID, OrderDate 
    from Customer C join CustOrder CO 
    on CO.CustomerID = C.CustomerID 
    where C.CustomerID = @CustomerID 
    and OrderDate >= Isnull(@startDate,'1900-01-01') 
    and OrderDate <= IsNull(@EndDate, getDate()) 

END 
2

書面似乎並不需要Customers表,所以查詢可以寫爲您的疑問:

Select OrderID, OrderDate 
from CustOrder CO 
where CO.CustomerID = @CustomerID and 
     OrderDate >= Isnull(@startDate,'1900-01-01') and 
     OrderDate <= IsNull(@EndDate, getDate()); 

然後你要在有表中沒有行打印的東西。我建議使用臨時表來存儲中間結果,這樣他們不必計算兩次。結果是這樣的:

Create procedure spCustOrder (
    @CustomerID VarChar(10), 
    @StartDate SmallDateTime = null, 
    @EndDate SmallDateTime = NUll 
) 
as Begin 

    Select OrderID, OrderDate 
    into #tmp 
    from CustOrder CO 
    where CO.CustomerID = @CustomerID and 
      OrderDate >= Isnull(@startDate,'1900-01-01') and 
      OrderDate <= IsNull(@EndDate, getDate()); 

    if exists (select 1 from #tmp) 
    begin 
     select * 
     from #tmp; 
    end 
    else 
     Print 'Please enter a CustomerID' 
end; -- spCustOrder 
1

說實話我會做完全不同的。你可以使用如下代碼:

ALTER PROCEDURE name 
@CustomerID (uniqueidentifier) - varchar is very bad solution for your performance 
@date1 DATE, 
@date2 DATE, 
@result INT OUTPUT=0 - use it as output parameter and handle text in app code 
AS 
BEGIN TRAN 
IF EXISTS (your SELECT query. You don't need DISTINCT) 
BEGIN 
-- if exists do something smart. I don't know... UPDATE TABLE 
IF @@error<>0 
BEGIN 
SET @result=1 --there was an error executing query in something smart 
END 
ELSE - from IF EXISTS statement 
BEGIN 
SET @result=2 --means no records found 
END 
IF @result=1 
BEGIN 
RETURN 1 --you know that this is error from your application code 
ROLLBACK TRAN --there was an error in doing something smart 
END 
IF @result=2 
RETURN 2 -- from your application code you know that this means no users found 
END 
IF RETURN=0 
BEGIN 
RETURN 0 -- userid found and something smart done without error :) 
COMMIT TRAN 
END 

希望這有助於。您應該更多地分析一下您在應用程序級別執行什麼操作,以及您想在數據庫級別執行什麼操作。 如果幫助,如果沒有標註它,帶着疑問