2014-11-14 118 views
-1

我想獲取存儲在變量中的CTE每列值,然後對其執行一些操作。最後將變量值存儲到其他表中。但是CTE中有超過10條記錄,所以我很困惑我如何做到這一點?如何更改cte列值

Declare @LineRead nvarchar(max) 
;with cte(ID,RecordLine) as (
    select Id,RecordLine from [dbo].[WorkDataImport] 
) 
select @LineRead = RecordLine + 'TEmp' 
print LineRead 

結果是

xyzaaddda Temp 

我不知道爲什麼我只得到一個記錄。

回答

2

這是因爲您正在使用SELECT進行變量賦值。 SQL Server支持非標準賦值語句SELECT,該語句允許查詢 數據並通過使用單個語句將從同一行獲取的多個值分配給多個變量。

分配SELECT具有可預測的行爲,只有一行合格。但是,如果查詢具有多個合格行,則代碼不會失敗。分配按照每個限定行進行,並且在訪問每行時,當前行的值會覆蓋變量中的現有值。當分配SELECT完成時,變量中的值是來自SQL Server偶然訪問的最後一行的值。 這就是爲什麼你只有一行。

更換SELECTSET和代碼將拋出錯誤爲: SET @LineRead = RecordLine + 'TEmp'

一種方法是所有行從CTE保存到臨時表中,然後執行操作如:

;with cte(ID,RecordLine) as (
    select Id,RecordLine from [dbo].[WorkDataImport] 
) 
select RecordLine + 'TEmp' as LineRead 
into #Temp1 
from cte 

select * from #Temp1 

Demo

1

試試如下:

;with mycte(ID,RecordLine) as (
    select Id,RecordLine from [dbo].[WorkDataImport] 
) 
select RecordLine + 'TEmp' into #temp from mycte 

然後檢索從#TEMP所有記錄(臨時表)

select * from #temp