2014-11-14 116 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