2014-03-04 8 views
3

저장 프로 시저에 잘못된 CustomerID를 입력하면 텍스트 메시지가 나타나는 if/else 문으로 저장 프로 시저를 만들려고합니다. 현재 CustomeID에 아무 것도 입력되어 있지 않을 때에 만 인쇄 라인을 제공합니다.저장 프로 시저 작성 오류 메시지

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 

기본적으로 내가 명확하지 오전은 내가 프로그램 기능을이 "@CustomerID> 0"대신에 "0"으로 사용해야하는 것이다. 나는 CustomerID 또는 C. 및 CO.CustomerID 사용하여 시도했지만 그 명령을 사용하여 오류가 있다고 말한다.

답변

2

당신이 일반적으로 저장 프로 시저에서 ID 또는 참/거짓 값을 반환하고 시저를 호출하는 루틴의 모든 인쇄 또는 IO를 수행 할, 또한

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

시도; proc 그 자체에서 입출력을 피하십시오.

0

IS NULL을 시도해보십시오 사용자 나던는 CustomerID를 통과하면

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 서버의 RAISERROR 기능은 오류가 발생 할 수 있습니다.

RETURN 키워드는 코드 실행을 중단하고 종료합니다. RETURN 키워드 다음에 추가 코드 줄이 실행되지 않습니다. 즉, @CustomerID의 값이 널 (null)이거나 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 

희망이 도움이됩니다. 애플리케이션 레벨에서 수행 할 작업과 DB 레벨에서 수행 할 작업에 대해 더 많이 분석해야합니다. 질문이있는 경우 표시하도록 도움을 준 경우 질문이있는 경우