我正在尝试使用XML输入从表中删除多行。删除基于两个列值:OwnerKey和QuestionNumber。 (两列都不包含唯一值。)
我能想到的唯一方法是构建一个包含XML输入值的临时表(即 - 2列),然后根据临时表和目标表的JOIN发出DELETE。 [如果有人有更好的方法,我会全力以赴。]
我现在遇到的问题是CREATE PROC失败并显示“无效列名”消息 - 指向“QuestionNumber” - XML字符串中的第二个属性。
如果我在SELECT INTO语句中明确列出了两列,则会出现语法错误 - 所以我使用 SELECT * 。这也不起作用。
有谁能举例说明如何做到这一点?
XML Input string (formatted here for readability):
-- <Answers>
-- <WebUser OwnerKey="104" QuestionNumber="1"/>
-- <WebUser OwnerKey="104" QuestionNumber="3"/>
-- </Answers>
SP:
CREATE PROCEDURE WebUserDeleteAnswer
@DeleteXMLString text
AS
BEGIN
SET NOCOUNT ON;
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT,
@DeleteXMLString
SELECT * INTO #temp
-- OwnerKey
-- INTO #temp
FROM OPENXML(@hdoc, 'Answers/WebUser', 2)
DELETE FROM WebUser
WHERE ( WebUser.OwnerKey = OwnerKey
AND WebUser.wu_QuestionNumber = **QuestionNumber**)
DROP TABLE #temp
EXEC sp_xml_removedocument @hDoc
END
GO
想出来。需要修改SELECT和DELETE命令:
(为了清晰起见,将 #temp 更改为 XmlTable )
BEGIN
DECLARE @hDoc int
EXEC sp_xml_preparedocument @hDoc OUTPUT,
@DeleteXMLString
SELECT * INTO XmlTable
FROM OPENXML(@hdoc, 'Answers/WebUser', 2)
WITH (OwnerKey int '@OwnerKey',
QuestionNumber int '@QuestionNumber')
DELETE WebUser
FROM WebUser
INNER JOIN XmlTable ON
(XmlTable.OwnerKey = WebUser.OwnerKey)
AND (XmlTable.QuestionNumber = WebUser.wu_QuestionNumber)
EXEC sp_xml_removedocument @hDoc
DROP TABLE XmlTable
答案 0 :(得分:0)
想出来。需要更改DELETE命令: 开始 DECLARE @hDoc int EXEC sp_xml_preparedocument @hDoc OUTPUT, @DeleteXMLString
SELECT * INTO XmlTable
FROM OPENXML(@hdoc, 'Answers/WebUser', 2)
WITH (OwnerKey int '@OwnerKey',
QuestionNumber int '@QuestionNumber')
DELETE WebUser
FROM WebUser
INNER JOIN XmlTable ON
(XmlTable.OwnerKey = WebUser.OwnerKey)
AND (XmlTable.QuestionNumber = WebUser.wu_QuestionNumber)
EXEC sp_xml_removedocument @hDoc
DROP TABLE XmlTable