如何在SQL Server中从XML参数中正确插入多个值?

时间:2014-12-27 09:33:19

标签: sql sql-server xml stored-procedures

我对XML很陌生。

我使用JavaScript和Ajax从表单中传递4个值作为XML字符串,并将SQL Server 2012传递给存储过程。

我的JS(相关部分):

var title = $('#title').val();
var summary = $('#summary').val();
var post = $('#details').val();
var departmentID = $('#departmentID').val();

var xmlMain = '<root><title>' + title + '</title><summary>' + summary + '</summary><post>' + post + '</post><departmentID>' + departmentID + '</departmentID></root>';

我的SQL(相关部分 - 参数@xmlMain定义为XML):

INSERT INTO RC_Posts
(
        title,
        summary,
        post,
        departmentID
)
OUTPUT  inserted.postID INTO @temp(insertRef)
SELECT  (
            SELECT  ParamValues.title.value('.','nvarchar(100)')
            FROM    @xmlMain.nodes('/root/title') as ParamValues(title)
        ),
        (
            SELECT  ParamValues.summary.value('.','nvarchar(500)')
            FROM    @xmlMain.nodes('/root/summary') as ParamValues(summary)
        ),
        (
            SELECT  ParamValues.post.value('.','nvarchar(max)')
            FROM    @xmlMain.nodes('/root/post') as ParamValues(post)
        ),
        (
            SELECT  ParamValues.departmentID.value('.','int')
            FROM    @xmlMain.nodes('/root/departmentID') as ParamValues(departmentID)
        )

我的主要问题是:

  1. 我是否必须像这样编写Select部分,或者有更好/更简单的方法来构建它?
  2. 我必须输入什么值,即我目前有'.'
  3. 的位置

    注意: 我的常规JS,Ajax和SQL之前只是传递标准的nvarchar / int值,但我现在需要将它们作为XML传递以保留某些特殊字符等。

1 个答案:

答案 0 :(得分:3)

您可以使用单个Xml Nodes()功能从XML

中提取值

像这样更改插入

INSERT INTO RC_Posts
            (title,summary,post,departmentID)
OUTPUT      inserted.postID
INTO @temp(insertRef)
SELECT [Xml_Tab].[Cols].value('(title)[1]', 'varchar(50)'),
       [Xml_Tab].[Cols].value('(summary)[1]', 'varchar(50)'),
       [Xml_Tab].[Cols].value('(post)[1]', 'varchar(50)'),
       [Xml_Tab].[Cols].value('(departmentID)[1]', 'varchar(50)')
FROM   @xml.nodes('/root')AS [Xml_Tab]([Cols]) 

示例:

DECLARE @xml XML ='<root>
<title> XML Demo </title>
<summary> Working of Xml Nodes </summary>
<post> Developer </post>
<departmentID> CS </departmentID>
</root>'

SELECT title=[Xml_Tab].[Cols].value('(title)[1]', 'varchar(50)'),
       summary=[Xml_Tab].[Cols].value('(summary)[1]', 'varchar(50)'),
       post=[Xml_Tab].[Cols].value('(post)[1]', 'varchar(50)'),
       departmentID=[Xml_Tab].[Cols].value('(departmentID)[1]', 'varchar(50)')
FROM   @xml.nodes('/root')AS [Xml_Tab]([Cols]) 

输出

title        summary                 post        departmentID
--------     --------------------    ---------   ------------
XML Demo     Working of Xml Nodes    Developer   CS