Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/extjs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何在SQL Server中循环XML类型并插入每次迭代的记录?_Sql Server_Xml - Fatal编程技术网

Sql server 如何在SQL Server中循环XML类型并插入每次迭代的记录?

Sql server 如何在SQL Server中循环XML类型并插入每次迭代的记录?,sql-server,xml,Sql Server,Xml,我想创建一个具有varcharmax参数的存储过程,该参数用作我在应用程序中构造的XML字符串的容器。我已经设法找到了这个xml字符串,它将作为varcharmax参数传递给存储过程,并将转换为xml: <SurveyQuestion> <Name>What is your pets name?</Name> <Type>1</Type> <IsRequired>True</IsRequired

我想创建一个具有varcharmax参数的存储过程,该参数用作我在应用程序中构造的XML字符串的容器。我已经设法找到了这个xml字符串,它将作为varcharmax参数传递给存储过程,并将转换为xml:

<SurveyQuestion>
    <Name>What is your pets name?</Name>
    <Type>1</Type>
    <IsRequired>True</IsRequired>
    <Answer></Answer>
</SurveyQuestion>
<SurveyQuestion>
    <Name>What is your gender?</Name>
    <Type>3</Type>
    <IsRequired>True</IsRequired>
    <Answer>Male</Answer>
    <Answer>Female</Answer>
    <Answer>Trans</Answer>
</SurveyQuestion>
<SurveyQuestion>
    <Name>Which colors do you like?</Name>
    <Type>4</Type>
    <IsRequired>False</IsRequired>
    <Answer>Yellow</Answer>
    <Answer>Green</Answer>
    <Answer>Red</Answer>
    <Answer>Blue</Answer>
    <Answer>Orange</Answer>
</SurveyQuestion>
<SurveyQuestion>
    <Name>Rate the service that you have receive from 1 to 5. I being the lowest and 5 being the highest</Name>
    <Type>2</Type>
    <IsRequired>True</IsRequired>
    <Answer>1</Answer>
    <Answer>2</Answer>
    <Answer>3</Answer>
    <Answer>4</Answer>
    <Answer>5</Answer>
</SurveyQuestion>
这是我的存储过程:

CREATE PROCEDURE
    @otherIrrelevantProperty nvarchar(120),
    @varcharXML varchar(max)
AS 
BEGIN
    BEGIN TRY
        DECLARE @questionsXML = CAST(@varcharXML AS XML)

        BEGIN TRANSACTION INSERTSURVEY
           LOOP(@questionsXML.question)
        BEGIN
            INSERT INTO Questions VALUES (..)

            LOOP(@questionsXML.answers)
            BEGIN
                INSERT INTO Answers VALUES (..)
            END
        END

        COMMIT TRANSACTION INSERTSURVEY

        SELECT 1
    END TRY
    BEGIN CATCH 
        IF (@@TRANCOUNT > 0)
        BEGIN
            ROLLBACK TRANSACTION INSERTSURVEY
        END 

        SELECT -1
    END CATCH
END
如果名称在XML中是唯一的,则可以使用两个INSERT和temp表来执行此操作:

创建表格问题 [Id][bigint]标识1,1不为空, [问题][varchar]max NULL-名称 创建表格答案 [Id][bigint]标识1,1不为空, [QuestionId][bigint]NULL,-外键问题 [选项][varchar]50空-回答 声明@xml= 你的宠物叫什么名字? 1. 符合事实的 你的性别是什么? 3. 符合事实的 男性的 女的 反式 你喜欢什么颜色? 4. 错误的 黄的 绿色 红色 蓝色 橙色 对您从1到5收到的服务进行评分。我是最低的,5是最高的 2. 符合事实的 1. 2. 3. 4. 5. '; 创建临时表 [Id][bigint]不为空, [问题][varchar]8000非空,-名称,唯一!!! 约束UC_问题唯一性问题 ; 插入问题 输出INSERTED.Id,INSERTED.Question 进入临时身份证,问题 选择n.value'.'和'varcharmax'名称 来自@xml.nodes'/root/SurveyQuestion/Name'xmln; 在答案中插入问题ID、选项 选择t.Id,n.value'.'和'varchar50'答案 从温度t 交叉应用@xml.nodes'/root/SurveyQuestion[Name=sql:columnt.question]/answersn; 从问题中选择*; 从答案中选择*; 放下桌上的问题; 下拉表格答案; 升降台温度;
循环和光标-一次也没有。这个名字是唯一的吗?
CREATE PROCEDURE
    @otherIrrelevantProperty nvarchar(120),
    @varcharXML varchar(max)
AS 
BEGIN
    BEGIN TRY
        DECLARE @questionsXML = CAST(@varcharXML AS XML)

        BEGIN TRANSACTION INSERTSURVEY
           LOOP(@questionsXML.question)
        BEGIN
            INSERT INTO Questions VALUES (..)

            LOOP(@questionsXML.answers)
            BEGIN
                INSERT INTO Answers VALUES (..)
            END
        END

        COMMIT TRANSACTION INSERTSURVEY

        SELECT 1
    END TRY
    BEGIN CATCH 
        IF (@@TRANCOUNT > 0)
        BEGIN
            ROLLBACK TRANSACTION INSERTSURVEY
        END 

        SELECT -1
    END CATCH
END