2012-12-18 30 views
0

我搜索了高和低,沒有找到答案。所以我希望你們n個女孩可以在我的路上幫助我:變量在動態SQL中有意外的NULL值

我無法弄清楚爲什麼在「SET @ new_comment ...」中使用它時爲什麼@old_comment是NULL,但是當它返回一個很好的值時使用它在輸出參數「SET @commentOldOUT ...」

CREATE PROCEDURE [dbo].[SP_NY_KOMMENTAR] 
    @tabel NVARCHAR(100), 
    @id INT, 
    @comment NVARCHAR(1000) = NULL, 
    @commentOldOUT NVARCHAR(1000) = NULL OUTPUT 
AS 
BEGIN 
    SET NOCOUNT ON; 

    DECLARE @user NVARCHAR(30); 
    DECLARE @date NVARCHAR(10); 
    DECLARE @new_id VARCHAR(100); 
    DECLARE @new_comment NVARCHAR(MAX); 
    DECLARE @old_comment NVARCHAR(MAX); 
    DECLARE @old_comm NVARCHAR(MAX); 
    DECLARE @old NVARCHAR(MAX); 
    DECLARE @q2 NVARCHAR(MAX); 

    SET @new_id = (SELECT CAST(@id AS VARCHAR(100))); 
    SET @user = (SELECT ORIGINAL_LOGIN()); 
    SET @date = (SELECT CONVERT(DATE,GETDATE())); 
    SET @old = 'SELECT comment FROM '+ @tabel +' WHERE id = ' + @ny_id; 

    EXEC sp_executesql 
     @query = @old, 
     @params = N'@old_comm NVARCHAR(MAX) OUTPUT', 
     @old_com = @old_comm OUTPUT; 

    SET @old_comment = (SELECT @old_comm); 

    SET @commentOldOUT = @old_comment;       

    SET @new_comment = COALESCE(@old_comment + CHAR(13),'') + '[' + @user + ' ' + @date + '] ' + @comment; 

    SET @q2 = N'UPDATE ' + @tabel + ' SET comment = ''' + @new_comment + ''' WHERE id = ' + @ny_id; 
    EXEC (@q2); 
END 

回答

0

對不起,我試過你的查詢,但對我來說它工作正常!你有沒有試圖「調試」你的查詢?在調試時可以看到每個變量的值。 (SQL Server 2008中的綠色箭頭)

+0

當調試它時,@old_comment不受'EXEC sp_executesql的分配 @query = @old, @params = N '@ old_comm NVARCHAR(MAX)OUTPUT', @ old_comm = @old_comm OUTPUT; SET @old_comment =(SELECT @old_comm);' –

+0

感謝您提示我調試,我不習慣使用SQL Server和SSMS,我可能會說我不幸更多的是Oracle人員...... –

+0

好的,Oracle也很好。我在學校學習了Oracle,但因爲工作原因,我轉而使用SQL Server。現在,我只做SQL Server。我很高興我的幫助:-) –

0

我猜你沒有明確地爲@comment參數傳遞一個值?如果是的話,那問題就在這裏:

SET @new_comment = COALESCE(@old_comment + CHAR(13),'') + '[' + @user + ' ' + @date + '] ' + @comment;

參數@commentNULL默認值,並與NULL結果NULL串聯什麼。這可以解釋爲什麼@old_comment,@user@date都具有數值,但是當它把它放在一起時,@new_comment就是NULL。這將是一個更好的默認值:

@comment NVARCHAR(1000) = '',

而且你的代碼所寫是有點亂,我認爲@old_comment@commentOldOUT僅用於調試目的?我不明白你爲什麼不直接使用@old_comm

最後,如果您正在使用動態SQL,那麼我強烈建議添加a debugging parameter以輕鬆打印出您的SQL字符串。這是一個非常有用的故障排除工具,特別是如果您沒有SSMS可用。

+0

'@ comment'參數被正確執行,但動態SELECT語句沒有返回任何內容。 –

+0

@ClausHjortBube你能澄清你的問題嗎?你問爲什麼一個變量是'NULL',但現在你說'SELECT'不返回任何東西。你有什麼問題?我發現你的'SELECT'中有一個用於表名的變量;你不能直接使用變量來代替對象名,所以'SELECT'根本不應該工作:http://stackoverflow.com/questions/13374782/how-to-define-a-variable-instead-of- table-name-in-sql – Pondlife

+0

我現在可以看到我不知道要問正確的問題......我不明白爲什麼@old_comment沒有設置。我曾經玩過這麼多的SP版本,所以我輸了。我的最後一個問題現在已經解決了,這要歸功於關於表變量的指導!我已經用工作存儲過程更新了我的_answer_。不知道這是否是正確的做法,也許還有其他一些沒有天賦的人,比如我,可以從中受益...... –

0

嗯,我現在可以看到我做了幾件事情錯了,下面是新的,和現在的工作,存儲過程:

CREATE PROCEDURE [dbo].[SP_NY_KOMMENTAR] 
    @tabel NVARCHAR(100), 
    @id INT, 
    @comment NVARCHAR(1000) = NULL 
AS 
IF @comment IS NOT NULL 
    BEGIN 
     SET NOCOUNT ON; 
     DECLARE @user NVARCHAR(30); 
     DECLARE @date NVARCHAR(10); 
     DECLARE @SQLSelect nvarchar(500); 
     DECLARE @ParmSelect nvarchar(500); 
     DECLARE @old_comment NVARCHAR(MAX); 
     DECLARE @old_commentOUT NVARCHAR(MAX); 
     DECLARE @new_comment NVARCHAR(MAX); 
     DECLARE @SQLUpdate nvarchar(500); 
     DECLARE @ParmUpdate nvarchar(500); 

     SET @user = (SELECT ORIGINAL_LOGIN()); 
     SET @date = (SELECT CONVERT(DATE,GETDATE())); 
     SET @SQLSelect = N'SELECT @old_commentOUT = kommentar FROM ' + QUOTENAME(@tabel) + ' WHERE id = @id'; 
     SET @ParmSelect = N'@id INT, @old_commentOUT NVARCHAR(MAX) OUTPUT'; 

     EXEC sp_executesql 
      @SQLSelect, 
      @ParmSelect, 
      @id = @id, 
      @old_commentOUT = @old_comment OUTPUT; 

     SET @old_comment = (SELECT @old_comment); 
     SET @new_comment = COALESCE(@old_comment + CHAR(13) + CHAR(10),'') + '[' + @user + ' ' + @date + '] ' + @comment; 

     SET @SQLUpdate = N'UPDATE ' + QUOTENAME(@tabel) + ' SET kommentar = @new_comment WHERE id = @id'; 
     SET @ParmUpdate = N'@id INT, @new_comment NVARCHAR(MAX)'; 
     EXEC sp_executesql 
      @SQLUpdate, 
      @ParmUpdate, 
      @id = @id, 
      @new_comment = @new_comment; 
    END 

比如我沒有使用正確的parameterbinding,在那之後我試着綁定tabelnames作爲參數...