sql-server-2005 - SQL Server 2005表变量更新问题

标签 sql-server-2005

我一直在阅读有关表变量和临时表之间的区别,并且偶然发现了表变量的以下问题。我所追求的文章中没有提到此问题。

我通过XML数据类型传递了一系列PK,并成功地在两个临时表结构中创建了记录。当我尝试更新临时表中的其他字段时,表变量失败,但是临时表的Update语句没有问题。有什么需要做的不同?我想利用Table Variables promise 的提速...

以下是SP片段和结果:

CREATE PROCEDURE ExpenseReport_AssignApprover
(
    @ExpenseReportIDs       XML
)
AS


DECLARE     @ERTableVariable        TABLE   (   ExpenseReportID             INT,
                                                ExpenseReportProjectID      INT,
                                                ApproverID                  INT)


CREATE TABLE #ERTempTable
(
    ExpenseReportID             INT,
    ExpenseReportProjectID      INT,
    ApproverID                  INT
)

INSERT INTO @ERTableVariable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

INSERT INTO #ERTempTable (ExpenseReportID)
SELECT ParamValues.ID.value('.','VARCHAR(20)')
FROM @ExpenseReportIDs.nodes('/Root/ExpenseReportID') as ParamValues(ID)

UPDATE          #ERTempTable
SET             ExpenseReportProjectID = (  SELECT TOP 1 ExpenseReportProjectID 
                                                FROM ExpenseReportItem 
                                                WHERE(ExpenseReportID = #ERTempTable.ExpenseReportID))

UPDATE          @ERTableVariable
SET             ExpenseReportProjectID = (  SELECT TOP 1 ExpenseReportProjectID 
                                                FROM ExpenseReportItem 
                                                WHERE(ExpenseReportID = @ERTableVariable.ExpenseReportID))

那里的最后一条更新语句出错:
必须声明标量变量“@ERTableVariable”。

当最后一次更新被注释掉时,ExpenseReportProjectID在#ERTempTable中更新:

最佳答案

在上一次更新中将表var引用字面化时,可以进行快速测试:

UPDATE @ERTableVariable
    SET ExpenseReportProjectID = (      
        SELECT TOP 1 ExpenseReportProjectID
        FROM ExpenseReportItem 
        WHERE ExpenseReportID = [@ERTableVariable].ExpenseReportID
    )

您还可以使用“更新自”:
UPDATE er SET 
    ExpenseReportProjectID = ExpenseReportItem.ExpenseReportProjectID
FROM @ERTableVariable er
INNER JOIN ExpenseReportItem ON 
    ExpenseReportItem.ExpenseReportID = er.ExpenseReportID

联接可能返回多行,但只有一行会“粘住”。一种不确定的更新,例如“TOP 1”。

关于sql-server-2005 - SQL Server 2005表变量更新问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/269404/

相关文章:

sql-server - SQL 服务器 : Import XML from web-server?

SQL Server INSERT … SELECT 语句无法解析

sql-server-2005 - 如何在 SQL Server 2005 中从一个表中的相应数据更新另一表中的数据

sql - 月份增量查询

sql - 使用 SQL Server 2005 检索每个组的 TOP X 成员

sql-server - 如何获取以下场景的 CSV 值

sql - 从日期时间中提取小时 (SQL Server 2005)

php - 在 Windows 以外的平台上使用 sqlsrv_connect

sql - 在动态 sql select 语句中增加别名

Java 连接到 MicrosoftSQLServer 2005