我有一个接收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>"
答案 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)
这对你有用吗?