2015-07-21 279 views
1

我有下面的代碼,我想循環遍歷一個表並設置一個變量,然後可以用來更新另一個表中的字段,但是當我嘗試讀取時,變量始終顯示爲NULL它。我究竟做錯了什麼?在TSQL中傳遞一個變量

declare @CustId nchar(15) 
declare @CustID1 nchar(255) 
declare @DateTime1 nchar(25) 
declare @finalnote varchar(max) 
declare @RowNum int 

declare CustList cursor for 
    select 
     DateTime, Username, Notes 
    from tbl_DesignNotes 
    where OrderNumber = 10645 
    order by ID 

OPEN CustList 

FETCH NEXT FROM CustList INTO @DateTime1, @CustId, @CustID1 
set @RowNum = 0 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    set @RowNum = @RowNum + 1 
    set @finalnote = @finalnote + ' ' + @DateTime1 + ' ' + @CustId + ' ' + @CustID1; 
    --select @finalnote 
    --print @finalnote 
    select @finalnote as varText; 

    --print @DateTime1 + ' ' + @CustId + ' ' + @CustID1 
    FETCH NEXT FROM CustList INTO @DateTime1, @CustId, @CustID1 
END 

CLOSE CustList 
DEALLOCATE CustList 
+1

有一個機會,\ @ DateTime1或\ @CustId或\ @ CustID1是空,因此嘗試使用ISNULL(\ @ DateTime1,GETDATE( ))等等。 –

+3

我認爲你可以把你的代碼改寫成單個語句,更新批量 –

+0

看看[這裏](http://stackoverflow.com/questions/194852/concatenate-many-rows-into-a-單個文本字符串),用於從多行數據構建字符串而不使用[RBAR]的一些方法(https://www.simple-talk.com/sql/t-sql-programming/rbar-row- by-agonizing-row /)循環。 – HABO

回答

3

@finalnote未初始化,所以它在進入循環之前是NULL。 用NULL串聯很少會(通常爲*)導致NULL,所以

set @finalnote = @finalnote + ' ' + @DateTime1 + ' ' + @CustId + ' ' + @CustID1; 

總是會導致NULL,不管是什麼// @ DateTime1,@CustId和@ CustID1包含。

因此,請在進入循環之前嘗試將其初始化爲空字符串。例如:

declare @finalnote varchar(max) = '' 

注*:有關詳細信息,請參見: https://msdn.microsoft.com/en-us/library/ms176056%28v=sql.110%29.aspx

+0

工作就像一個魅力。我的英雄!!!!謝謝。 – Keith