迭代XML输入参数时执行DELETE命令

时间:2012-02-23 16:43:00

标签: sql-server loops nodes sql-delete

我有一个接收2个参数的存储过程。

@username VARCHAR(8), 
@xmlShiftDays XML

我希望在迭代XML时从数据库中删除多行。

我已经设法为INSERT做了类似的事情(见下文)

INSERT INTO table(username, date)
   SELECT 
       username = @username, 
       CONVERT(DATETIME,shiftDate.date.value('.','VARCHAR(10)'),103)
   FROM 
       @xmlShiftDays.nodes('/shiftDates/date') as shiftDate(date)

这会在我的表格中成功插入“x”行。

我现在想要将查询重新设计为DELETE“x”行数。如果有人知道如何或可以指出我正确的方向,我将非常感激。

我想要实现的一个例子是:

DECLARE @username VARCHAR(8)
DECLARE @xmlShiftDays XML 

SET @xmlShiftDays = '<shiftDates><date>21/01/2012</date></shiftDates>'
SET @username = 'A0123456'

DELETE FROM table
WHERE username = @username
AND date = "<b>loop through the nodes in the XML string</b>"

2 个答案:

答案 0 :(得分:0)

您可以按照与插入相同的方式从Xml中选择日期:

    DELETE FROM table
    WHERE username = @username
    AND date IN (SELECT 
           CONVERT(DATETIME,shiftDate.date.value('.','VARCHAR(10)'),103)
       FROM 
           @xmlShiftDays.nodes('/shiftDates/date') as shiftDate(date))

答案 1 :(得分:0)

假设您正在使用SQL Server 2008 (或更新版本),因此我可以使用DATE数据类型(遗憾的是,您没有在您的问题中指定哪个版本的SQL你正在使用的服务器).....

强烈建议您在XML中使用与语言无关,区域设置无关的日期格式 - 使用YYYYMMDD的ISO-8601格式以获得最佳效果。

所以尝试这样的事情:

DECLARE @xmlShiftDays XML 

SET @xmlShiftDays = '<shiftDates><date>20120122</date><date>20120227</date></shiftDates>'

;WITH DatesToDelete AS
(
    SELECT
        DeletionDate = DT.value('(.)[1]', 'date')
    FROM @XmlShiftDays.nodes('/shiftDates/date') AS SD(DT)
)
SELECT * FROM DatesToDelete

这应该为你提供两个结合成XML字符串的日期 - 对吗?

现在,您可以使用它来从表中删除:

DECLARE @username VARCHAR(8)
DECLARE @xmlShiftDays XML 

SET @xmlShiftDays = '<shiftDates><date>20120122</date><date>20120227</date></shiftDates>'
SET @username = 'A0123456'

;WITH DatesToDelete AS
(
    SELECT
        DeletionDate = DT.value('(.)[1]', 'date')
    FROM @XmlShiftDays.nodes('/shiftDates/date') AS SD(DT)
)
DELETE FROM dbo.Table
WHERE username = @username
AND date IN (SELECT DeletionDate FROM DatesToDelete)

这对你有用吗?