从CTE更新表行

时间:2013-06-26 18:46:38

标签: sql-server

我有一个变量@xml,如下所示:

<root>
    <row USER_KEY="1" USER_NAME="test" USER_ID="12345" USER_STATUS=" " USER_GENDER="F" />
</root>

因此,在我的存储过程中,我必须阅读此xml并根据tbl_USER从xml更新USER_KEY表的行。

CREATE TABLE #tbl(Name nvarchar(250),
                  Value nvarchar(250));

Insert Into #tbl(Name, Value)
   select 
       T.N.value('local-name(.)', 'nvarchar(100)'),
       T.N.value('.', 'nvarchar(250)')
   from 
       @XML.nodes('/root/row/@*') as T(N)

现在我需要使用这些值更新tbl_user。有人可以帮帮我吗?

由于

1 个答案:

答案 0 :(得分:0)

你可以尝试这样的事情(我只是猜测tbl_user表中的列被调用了什么,你没有提供这些信息 - 所以你需要根据需要调整:

;WITH UpdateCTE AS
(
    SELECT
        UserKey = (SELECT Value FROM #tbl WHERE Name = 'USER_KEY'),
        UserName = (SELECT Value FROM #tbl WHERE Name = 'USER_NAME'),
        UserID = (SELECT Value FROM #tbl WHERE Name = 'USER_ID'),
        UserStatus = (SELECT Value FROM #tbl WHERE Name = 'USER_Status'),
        UserGender = (SELECT Value FROM #tbl WHERE Name = 'USER_Gender')
    FROM #tbl
)
UPDATE dbo.tbl_Users
SET UserName = cte.UserName,
    UserID = cte.UserID,
    Status = cte.UserStatus,
    Gender = cte.UserGender
FROM dbo.Users u
INNER JOIN UpdateCTE cte ON u.UserKey = cte.UserKey

基本上,我根据你的临时表创建一个CTE(公用表表达式),并选择存储在其中的值作为列。根据该CTE,我可以使用常规T-SQL UPDATE语句根据这些临时值更新tbl_Users表。

这适用于SQL Server 2005 及更新版本(再次:您未在问题中提供该信息)

或者,我认为你不一定需要临时表。您可以使用CTE直接从XML变量中“删除”属性,然后使用它们更新tbl_Users表 - 如下所示:

;WITH UpdateCTE AS 
(
   SELECT 
        UserKey = T.N.value('@USER_KEY', 'INT'),
        UserName = T.N.value('@USER_NAME', 'VARCHAR(50)'),
        UserID = T.N.value('@USER_ID', 'INT'),
        UserStatus = T.N.value('@USER_STATUS', 'VARCHAR(50)'),
        UserGender = T.N.value('@USER_GENDER', 'CHAR(1)')
   FROM
       @XML.nodes('/root/row') as T(N)
)
UPDATE dbo.tbl_Users
SET UserName = cte.UserName,
    UserID = cte.UserID,
    Status = cte.UserStatus,
    Gender = cte.UserGender
FROM dbo.Users u
INNER JOIN UpdateCTE cte ON u.UserKey = cte.UserKey

再次:根据需要调整列名(以及XQuery .value()调用的类型) - 我只是猜测 ....