從CTE

2013-06-26 25 views
1

更新錶行我有一個變量@xml如下:從CTE

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

所以在我的存儲過程,我要讀這個XML和更新基於USER_KEY從XML的tbl_USER表的行。

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

可以使用OPENXML 這可能有助於-http讀取XML參數://stackoverflow.com/questions/3244796/stored -procedure-passing-a-parameter-as-xml-and-reading-the-data – Devasayal

+1

你可以在'tbl_user'的表格結構中添加一些示例數據以及更新後的結果嗎? –

+0

您的XML是否只有一個''類型的條目?否則,您需要了解如何將各種值與給定的''關聯...... –

回答

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()話費)根據需要 - 我只是猜測這裏 ....