2014-12-27 36 views
1

我对XML很新颖,正在寻找一种方法来使用输入参数中的XML来存储过程的下面部分(使用SQL Server 2012)。
XML是通过JS/AJAX提交的,看起来像这样:SQL Server:如何正确使用xml参数来更新过程

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

SQL中的参数定义为:

@xmlMain xml 

从XML选择以下工作:

SELECT [Xml_Tab].[Cols].value('(title)[1]', 'nvarchar(100)'), 
     [Xml_Tab].[Cols].value('(summary)[1]', 'nvarchar(500)'), 
     [Xml_Tab].[Cols].value('(post)[1]', 'nvarchar(max)'), 
     [Xml_Tab].[Cols].value('(departmentID)[1]', 'int') 
FROM @xmlMain.nodes('/root') AS [Xml_Tab]([Cols]) 

我不能弄清楚的是如何应用这样的东西到下面:

UPDATE RC_Posts 
SET  title = @title, 
     summary = @summary, 
     post = @post, 
     departmentID = @departmentID 
WHERE postID = @postID 

我希望这里有人能帮助我。 Tim先生非常感谢。

+1

你在有''Postid' @ XmlMain'或从那里你会得到'@ postID' – 2014-12-27 15:40:59

+0

谢谢 - 生成单独帖子ID所以这不包括XML字符串中(在XML只包含上面数据)。在这种情况下,postID存储在一个临时表之前的这部分过程:OUTPUT \t inserted.postID INTO @temp(insertRef) – user2571510 2014-12-27 15:41:58

+0

因此,如何知道'@ XmlMain'中的信息属于特定的'postID' – 2014-12-27 15:43:26

回答

3

尝试像这样更新。

UPDATE A 
SET title = b.title, 
     summary = b.summary, 
     post = b.post, 
     departmentID = b.departmentID 
FROM RC_Posts A 
     JOIN (SELECT title=[Xml_Tab].[Cols].value('(title)[1]', 'nvarchar(100)'), 
        summary=[Xml_Tab].[Cols].value('(summary)[1]', 'nvarchar(500)'), 
        post=[Xml_Tab].[Cols].value('(post)[1]', 'nvarchar(max)'), 
        departmentID=[Xml_Tab].[Cols].value('(departmentID)[1]', 'int'), 
        PostID=[Xml_Tab].[Cols].value('(postID)[1]', 'int') 
      FROM @xmlMain.nodes('/root') AS [Xml_Tab]([Cols])) B 
     ON a.postID = b.postID 
+0

工作原理 - 非常感谢您的快速帮助! – user2571510 2014-12-27 16:03:06

+0

@ user2571510很高兴帮助您:) – 2014-12-27 16:03:44

+1

SQL服务器最常用的功能之一。非常适合批量插入,更新甚至选择。 – 2014-12-27 19:34:53

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

我建议你使用一个XmlDocument来构建所需的XML在你的代码,而不是字符串连接。这将正确处理实体引用,否则会破坏XML解析器。例如,“Travel & Expenses”的标题值将作为元素文本无效。使用XML方法将用正确的实体引用替换&符号。

使用UPDATE ... FROM语法更新具有XML元素值的表的一种方法是使用UPDATE ... FROM语法。这假定@PostID作为单独的参数传递。

CREATE PROC dbo.usp_UpdateRC_PostsFromXml 
     @postID int 
    , @xmlMain XML 
AS 

UPDATE p 
SET  title = [Cols].value('(title)[1]', 'nvarchar(100)'), 
     summary = [Cols].value('(summary)[1]', 'nvarchar(500)'), 
     post = [Cols].value('(post)[1]', 'nvarchar(max)'), 
     departmentID = [Cols].value('(departmentID)[1]', 'int') 
FROM RC_Posts AS p 
CROSS APPLY @xmlMain.nodes('/root') AS [Xml_Tab]([Cols]) 
WHERE postID = @postID; 
GO 
相关问题