如何更改cte列值

时间:2014-11-14 08:05:48

标签: sql sql-server sql-server-2008 tsql sql-server-2012

我想让CTE将每个列值存储在变量中,然后对其执行一些操作。最后将变量值存储到其他表中。但是CTE中有超过10条记录,所以我很困惑我是怎么做到的?

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

结果是

xyzaaddda Temp

我不知道为什么我只得到一条记录。

2 个答案:

答案 0 :(得分:2)

那是因为您使用SELECT进行变量分配。 SQL Server支持非标准赋值SELECT语句,允许查询 数据并使用单个语句将从同一行获得的多个值分配给多个变量。

当一行符合条件时,赋值SELECT具有可预测的行为。但是,如果查询具有多个符合条件的行,则代码不会失败。每个符合条件的行都会进行赋值,并且访问每一行时,当前行中的值将覆盖变量中的现有值。当赋值SELECT完成时,变量中的值是SQL Server碰巧访问的最后一行中的值。 这就是为什么你只得到一排。

SELECT替换为SET,代码将抛出错误: 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 :(得分:1)

尝试如下:

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

然后从#temp(临时表)

中检索所有记录
select * from #temp