2013-06-26 3 views
1

J'ai un @xml variable comme suit:mettre à jour une ligne de table de CTE

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

Donc dans ma procédure stockée je dois lire ce xml et mettre à jour la ligne de la table tbl_USER basée sur USER_KEY de xml.

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) 

Maintenant je dois mettre à jour le tbl_user avec ces valeurs. Quelqu'un peut-il m'aider?

Merci

+0

Vous pouvez lire les paramètres XML à l'aide OPENXML Cela pourrait aider -http: //stackoverflow.com/questions/3244796/stored -procedure-passing-a-parameter-comme-xml-and-reading-the-data – Devasayal

+1

Pouvez-vous ajouter la structure de table de 'tbl_user' avec quelques exemples de données et quel devrait être le résultat après la mise à jour? –

+0

Votre XML ne va-t-il jamais avoir une seule entrée de type ''? Sinon, vous devrez trouver comment associer les différentes valeurs avec un '' donné ... –

Répondre

0

Vous pouvez essayer quelque chose comme ça (je suis juste deviner ce que les colonnes de votre table tbl_user sont appelés, vous n'avez pas fourni cette information - donc vous aurez besoin d'adapter ce que nécessaire):

;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 

Fondamentalement, je crée un CTE (Common Table expression) en fonction de votre table temporaire, et je sélectionner les valeurs qui y sont stockées sous forme de colonnes. Sur la base de ce CTE, je peux ensuite utiliser une instruction T-SQL UPDATE pour mettre à jour la table tbl_Users en fonction de ces valeurs temporaires.

Cela fonctionne dans SQL Server 2005 et plus récent (encore une fois: vous n'avez pas fourni cette information dans votre question)

Sinon, vous ne devez pas nécessairement une table temporaire ici, je pense. Vous pouvez utiliser le CTE directement « poisson » les attributs de la variable XML, puis les utiliser pour mettre à jour votre tbl_Users tableau - quelque chose comme ceci:

;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 

Encore une fois: adapter les noms de colonnes (et les types de les appels XQuery .value()) en fonction des besoins - je suis juste deviner ici ....

Questions connexes