使用 OPENXML 读取 XML 时出错

Getting error while reading XML with OPENXML

我正在 SQL Server 2012 的存储过程中使用 OPENXML 读取 XML 数据。

我的XML:

<name>
    <name>Temp1</name>
    <data>
        <mealID>5</mealID>
        <food>
            <foodID>11</foodID>
        </food>
        <food>
            <foodID>12</foodID>
        </food>
    </data>
    <data>
        <mealID>6</mealID>
        <food>
           <foodID>13</foodID>
        </food>
    </data>
</name>

我的存储过程:

ALTER PROCEDURE [dbo].[sp_Insert_EatingProgramTemplate] 
    @Template xml,
    @intOutSuccess nvarchar(10) OUTPUT,
    @ErrorSeverity nvarchar(MAX) OUTPUT,
    @ErrorMesg nvarchar(MAX) OUTPUT
AS
BEGIN
    DECLARE @idoc int

    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    SET @ErrorSeverity = ''
    SET @ErrorMesg = ''
    SET @intOutSuccess = ''

    BEGIN TRY
        SELECT *
         FROM OPENXML (@idoc, '/ROOT/Customer',1)
         WITH (CustomerID  varchar(10),
               ContactName varchar(20))
        SET @intOutSuccess = 1
    END TRY
    BEGIN CATCH
        SET @ErrorSeverity = ERROR_SEVERITY()  
        SET @ErrorMesg = ERROR_MESSAGE() 
        SET @intOutSuccess = -1
        GOTO A
    END CATCH
A:
    END
GO

执行此过程时出现此错误:

Could not find prepared statement with handle 0

任何帮助,为什么我会收到此错误?

您错过了通过调用 sp_xml_preparedocument 来设置 @idoc,例如:

declare @template xml = '<name>
    <name>Temp1</name>
    <data>
        <mealID>5</mealID>
        <food>
            <foodID>11</foodID>
        </food>
        <food>
            <foodID>12</foodID>
        </food>
    </data>
    <data>
        <mealID>6</mealID>
        <food>
           <foodID>13</foodID>
        </food>
    </data>
</name>'
DECLARE @idoc int
EXEC sp_xml_preparedocument @idoc OUTPUT, @template; 

SELECT *
     FROM OPENXML (@idoc, '/name/data/food/foodID',1)
     WITH (FoodID  INT '.',
           MealID INT '../../mealID')

--clear parsed XML document from SQL Server cache
EXEC sp_xml_removedocument @idoc; 

您也可以通过直接查询 xml 变量来实现相同的输出:

SELECT 
    x.value('.', 'int') as FoodID
    , x.value('../../mealID[1]', 'int') as MealID
FROM @template.nodes('/name/data/food/foodID') as T(X)