2012-03-28 5 views
1

Когда я пытаюсь запустить обновление типа кредитной карты, передав в @Id и @name я получаю ошибку, которая говорит:Проблем с IF EXISTS()

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, используя это заявление:

-- 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() таким образом, но по какой-то причине он дает мне ошибку.

Вот и весь процесс.

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) 

To:

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

%s используется для подстановки строк ... но %d является параметром замещения для Интс.

RAISERROR in MSDN

+0

О, черт возьми! Ты отличный брат, спасибо за помощь. Это была проблема. Урок выучен. Спасибо чувак! – Cory