Выполните команду DELETE, перебирая входной параметр XML - PullRequest
1 голос
/ 23 февраля 2012

У меня есть хранимая процедура, которая получает 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 голосов
/ 23 февраля 2012

Если вы используете для этого SQL Server 2008 (или новее), чтобы я мог использовать тип данных DATE (к сожалению, вы не указали в своем вопросе, какую версию SQL Server вы используете ' повторное использование) .....

Я бы настоятельно рекомендовал бы использовать в XML-формате независимый от языка и региональных настроек формат - для достижения наилучших результатов используйте формат ISO-8601 YYYYMMDD.

Так что попробуйте что-то вроде этого:

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)

Это работает для вас?

0 голосов
/ 23 февраля 2012

Вы можете выбрать дату из 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))
...