我想让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
我不知道为什么我只得到一条记录。
答案 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
答案 1 :(得分:1)
尝试如下:
;with mycte(ID,RecordLine) as (
select Id,RecordLine from [dbo].[WorkDataImport]
)
select RecordLine + 'TEmp' into #temp from mycte
然后从#temp(临时表)
中检索所有记录select * from #temp