2014-03-04 30 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 

希望这有助于。您应该更多地分析一下您在应用程序级别执行什么操作,以及您想在数据库级别执行什么操作。 如果帮助,如果没有标注它,带着疑问