公共表表达式中的数据是静态的吗?

时间:2014-08-19 16:32:48

标签: sql-server common-table-expression

我想知道CTE中的数据是否是静态的(当它从创建的原始表中进行更改时它是否保持不变) - 我认为答案是肯定的,但我想确定。例如:

DECLARE @TSCourseID as INT = 123456789;

WITH CTE as
(
SELECT
    TSRegistrants.TSRegistrantID
    ,TSRegistrants.Name
    ,TSRegistrants.Email
    ,TSRegistrants.PhoneNumber
FROM TSRegCourseDetail
    JOIN TSRegistrants
        ON TSRegCourseDetail.TSRegistrantID = TSRegistrants.TSRegistrantID
WHERE TSRegCourseDetail.TSCourseID = @TSCourseID
    AND TSRegistrants.Name in ('User List')
)

UPDATE TSRegCourseDetail
SET TSCourseID = 987654321
WHERE TSRegistrantID in (select TSRegistrantID from CTE)

1)这会改变CTE中的数据吗?如果是这样,此查询将清空它;我希望它没有

2)另外,从CTE工作中选择TSRegistrantID进行更新/设置会更好吗?

我不是程序员,暂时还没戴上帽子>。<

谢谢!

2 个答案:

答案 0 :(得分:2)

在UPDATE发生之前评估CTE,所以就你的意思而言,没有数据不会改变。

此外,CTE只能与一个select语句(或更新或插入)一起使用。如果您希望它可用于多个语句,则需要临时表或表变量。

答案 1 :(得分:0)

根本不需要使用CTE:

DECLARE @TSCourseID AS INT = 123456789

UPDATE  cd
SET     cd.TSCourseID = 987654321
FROM    TSCourseDetail cd
        INNER JOIN TSRegistrants r ON cd.TSRegistrantID = r.TSRegistrantID
WHERE   cd.TSRegistrantID = @TSCourseID
        AND TSRegistrants.Name IN ( 'User List' )