2012-03-28 1 views
1

나는라는 오류 얻을 @ID과 @Name를 전달하여 신용 카드 종류를 업데이트 실행하려고하면 :문제()

Msg 2786, Level 16, State 1, Procedure sp_SaveCreditCardType, Line 29 
The data type of substitution parameter 1 does not match the expected type of the format specification. 

문제는 코드 내 조각입니다 그이 문을 사용하여 CreditCardTypes 테이블의 ID의 존재에 대한 검사 :

-- make sure the ID is a valid number 
     IF NOT EXISTS (SELECT * FROM CreditCardTypes WHERE ID = @ID) 
      BEGIN 
       RAISERROR('The Credit Card ID ''%s'' does not exist. Update Failed.', 15, 1, @ID) 
       RETURN -100 
      END 

사람이 나에게 오류를 제공 할 수있는 이유 어떤 생각을 가지고 있습니까? 이런 식으로 if exists()를 사용하는 많은 예제를 보았습니다. 그러나 어떤 이유로 그것이 저에게 오류를줍니다.

다음은 전체 proc입니다.

CREATE PROCEDURE dbo.sp_SaveCreditCardType 
(
@ID int = null, 
@Name varchar(50), 
@Description varchar(150) = null 
) 
AS 

DECLARE 
@Err INT 

BEGIN 
SET NOCOUNT ON 

-- check to make sure a Name was passed in 
IF @Name IS NULL 
    BEGIN 
     RAISERROR('A Name was not specified. Execution aborted.', 15, 1, @Name) 
     RETURN -100 
    END 

-- check to see if an ID is passed 
IF @ID IS NOT NULL AND @ID <> 0 
    BEGIN 
     -- make sure the ID is a valid number 
     IF NOT EXISTS (SELECT * FROM CreditCardTypes WHERE ID = @ID) 
      BEGIN 
       RAISERROR('The Credit Card ID ''%s'' does not exist. Update Failed.', 15, 1, @ID) 
       RETURN -100 
      END 

     -- update an existing credit card type 
     UPDATE CreditCardTypes 
      SET Name = @Name, 
       [Description] = @Description 
      WHERE ID = @ID 
     SET @Err = @@ERROR 
      IF @Err <> 0 GOTO ErrorHandler 
    END 
ELSE 
    BEGIN 
     -- first check to make sure the credit card type doesn't already exist 
     IF NOT EXISTS (SELECT * FROM CreditCardTypes WHERE Name = @Name) 
      BEGIN 
       -- insert a new credit card type 
       INSERT INTO CreditCardTypes (Name, [Description]) 
       VALUES (@Name, @Description) 

       SET @Err = @@ERROR 
        IF @Err <> 0 GOTO ErrorHandler 
      END 
     ELSE 
      RAISERROR('The Credit Card Type ''%s'' already exists. Insert failed.', 15, 1, @Name) 
      RETURN -100 
    END 

SET @Err = @@ERROR 
    IF @Err <> 0 GOTO ErrorHandler 
RETURN 0 

ErrorHandler: 
    RAISERROR('An error occured while saving the credit card type ''%s''', 16, 1, @Name) WITH LOG 
    RETURN -100 
END 
GO 

답변

2

변경 :

RAISERROR('The Credit Card ID ''%s'' does not exist. Update Failed.', 15, 1, @ID) 

사람 :

RAISERROR('The Credit Card ID ''%d'' does not exist. Update Failed.', 15, 1, @ID) 

%s 문자열을 대체에 사용됩니다 ...하지만 %d은의 int에 대한 대체 매개 변수입니다.

RAISERROR in MSDN

+0

오 마이 지옥! 당신은 도움을 주셔서 대단히 감사합니다. 그것은 정확히 문제였습니다. 수업은 배웠다. 고마워요! – Cory