将XML传递给节点中的存储过程

时间:2017-01-25 21:17:04

标签: sql-server node.js stored-procedures

我试图弄清楚如何使用MSSQL节点驱动程序将XML值传递给存储过程,从文档中我可以看到驱动程序支持存储过程,并且还定义了自定义数据类型,如这个:

sql.map.register(MyClass, sql.Text);

但我还没有找到一个例子,到目前为止如何为XML做到这一点。

我确实找到了类似的question但是对于.NET SQL驱动程序,试图弄清楚是否有人为Node做过这个。

更新

我能够将XML发送到存储过程并在数据库中解析它,例如:

var request = new sql.Request(connection);
var xml = '<root><stock><id>3</id><name>Test3</name><ask>91011</ask></stock></root>'
request.input('XStock', sql.Xml, xml);

request.execute('StockUpdateTest', function (err, recordsets, returnValue, affected) {

});

1 个答案:

答案 0 :(得分:3)

我不知道这个特例,但有一些一般性的想法:

存储过程的输入参数(可能需要一些XML)可以是XMLVARCHARNVARCHAR。好吧,仅举这一点,VARBINARY也可能有效,但为什么要这样做......

SQL-Server中的字符串是8位编码(VARCHAR)或16位(NVARCHAR), XML - 在任何情况下 - NVARCHAR内部

大多数情况都会被隐含地呈现。您可以将有效的XML作为VARCHARNVARCHAR传递,并将其分配给XML类型的变量。两者都有效。但是,如果您的XML包含特殊字符,您将遇到麻烦......

重要:如果XML包含<?xml ... encoding="utf-8"?>之类的声明,则必须VARCHAR的形式移交给XML变量,而utf-16 1}} 必须NVARCHAR。在任何情况下,SQL Server中都会省略此声明,因此最简单的方法是将XML作为字符串传递而不进行此类声明。

明确的建议是,将XML作为16位unicode字符串传递,而不是<?xml ...?> - 声明。这样做,就不会有隐式转换,也不会遇到特殊字符和/或编码问题。

您的SP可以将参数定义为XMLNVARCHAR(MAX),并将其内部分配给类型变量。

希望这有帮助!