如何在SP中使用XML字符串输入来删除基于两个列值的行

时间:2011-04-11 00:11:24

标签: xml stored-procedures

我正在尝试使用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

1 个答案:

答案 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