Sql server 如何在SQL Server中循环XML类型并插入每次迭代的记录?
我想创建一个具有varcharmax参数的存储过程,该参数用作我在应用程序中构造的XML字符串的容器。我已经设法找到了这个xml字符串,它将作为varcharmax参数传递给存储过程,并将转换为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
<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