我有一个变量@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
。有人可以帮帮我吗?
由于
答案 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()
调用的类型) - 我只是猜测 ....