2015-12-28 34 views
0

我工作的存儲過程,我面臨的一個問題我不能夠解決,甚至有研究...IF在存儲過程

我想給的可能性爲我的用戶填寫某些記錄上有一個名字(NOM),但他們不被強迫。如果他們不,我想,以填補自己是否與日期,這是我的煩惱......

CREATE PROCEDURE [dbo].[G_INSERT](
    @NOM Text = null 
) AS 
BEGIN 
    IF (@NOM IS NULL OR @NOM = '') 
    BEGIN 
     SET @NOM = 'Evaluation du' + CONVERT(text, GETDATE(), 100) 
    END 

    INSERT INTO toto(
     NOM) 
    VALUES (
     @NOM 
    ) 
END 

這是我目前的程序,但它不是工作... Visual Studio中犯規報告任何錯誤,但是當我在「更新」點擊,更新失敗:(

這可能是「如果開始......結束」,因爲當我刪除它,它工作正常。

感謝您的幫助!

編輯:

數據類型text和varchar在等於運算符中不兼容。 在第27行(「if」行,NOM是DB中的varchar(300))

+0

編輯你的問題,並解釋如何更新失敗。 –

+0

我編輯它,但它讓我更加迷惑... NOM是一個varchar(300) – Armassarion

+0

這是哪種RDBMS的用途?請添加一個標籤來指定您是使用'mysql','postgresql','sql-server','oracle'還是'db2' - 或者其他的東西。 –

回答

1

好的,我發現@NOM是文本,根據過程。簡單的錯誤。

2

TEXT是一種過時的數據類型,不應再使用(請參閱here)。

可以編寫存儲過程爲:

CREATE PROCEDURE [dbo].[G_INSERT] (
    @NOM VARCHAR(255) = null 
) AS 
BEGIN 
    IF (@NOM IS NULL OR @NOM = '') 
    BEGIN 
     SET @NOM = 'Evaluation du' + CONVERT(text, GETDATE(), 100) 
    END 

    INSERT INTO toto(NOM) 
     SELECT (CASE WHEN @NOM IS NULL OR @NOM = '' 
        THEN 'Evaluation du ' + CONVERT(VARCHAR(255), GETDATE(), 100) 
        ELSE @NOM 
       END); 
END; 

可以簡化邏輯並取出IF

+0

我一直認爲TEXT對性能不好,但比varchar更容易使用,順便說一下,我沒有使用TEXT,我只是寫了太快的程序:/ 還是謝謝你(我簡化了程序來顯示你,它就像是20倍大,所以我寧願使用一個小的IF,而不是插入到^^中間的一個大的選擇,仍然感謝你給我展示我不知道的東西:select case) – Armassarion

0

你可以使用這個語法:

CREATE PROCEDURE [dbo].[G_INSERT] (
    @NOM VARCHAR(255) = null 
) AS 
BEGIN 

    INSERT INTO toto(NOM) 
     SELECT iif(@NOM IS NULL OR @NOM = '','Evaluation du ' + CONVERT(VARCHAR(255), GETDATE(), 100),@NOM); 
END;