1

我有一个变量@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用这些值更新。有人可以帮助我吗?

谢谢

4

1 回答 1

1

您可以尝试这样的事情(我只是在猜测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-SQLUPDATE语句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()调用的类型)——我只是在这里猜测......

于 2013-06-26T20:41:26.413 回答