2014-05-15 50 views
0

中的记录我有一个csv文件,我正在阅读并为其生成一个XML字符串。然后,我将该XML字符串发送到存储过程并解析出来。TSQL XML检查表

SELECT  ParamValues.x2.value('empID[1]', 'VARCHAR(60)'), 
       ParamValues.x2.value('transactionID[1]', 'VARCHAR(100)'), 
       ParamValues.x2.value('emailAddress[1]', 'VARCHAR(100)'), 
       ParamValues.x2.value('paymentStatus[1]', 'VARCHAR(100)'), 
       ParamValues.x2.value('shirtSize[1]', 'VARCHAR(20)'), 
       ParamValues.x2.value('paymentAmount[1]', 'VARCHAR(20)'), 
       ParamValues.x2.value('paymentDate[1]', 'DATETIME') 
     FROM @xmlData.nodes('/orders/order') AS ParamValues(x2) 

从这里,我需要遍历一张表,看看paymentStatus是否已经完成。如果不是,那么我们将使用从XML值获得的数据更新该行。

从这一点来看,最好的方法是什么?

+1

#1,不要循环。 #2用一些插入语句发布一些示例DDL ....然后说出你想要比较和更新的内容。 #3不循环#4不循环 – granadaCoder

+0

这是不是很清楚,你期望什么逻辑:从现有的表中选择并加入它的XML值,以更新或修改根据'paymentStatus'值基于XML值?你应该明确你的脚本的最终目标 – xacinay

回答

0

循环的内容你应该能够运行一个UPDATE语句并加入到XML中。

UPDATE target 
SET [paymentStatus] = source.[data].value('paymentStatus[1]', 'VARCHAR(100)') 
FROM [Orders] target 
INNER JOIN @xmlData.nodes('/orders/order') AS source ([data]) 
    ON --?? How do you match nodes in the XML to rows in the table? 
    -- Maybe.. 
    source.[data].value('orderID[1]', 'INT') = target.[OrderId] -- ?? 
WHERE target.[paymentStatus] <> 'Completed'