我有一个关于将 xml 数据类型从 C# 代码传递给查询的问题。
首先,下面是 SQL Server 上的一个表:
CREATE TABLE [dbo].[XmlTable](
[id] [int] IDENTITY(1,1) NOT NULL,
[dat] [xml] NOT NULL
)
其次,我有一个用 C# 编写的应用程序。我将行插入应用程序的XmlTable
中。
代码如下:
XDocument doc = new XDocument(new XElement("root",
new XElement("abc", "123"),
new XElement("cba", "321")));
var reader = new XmlTextReader(new StringReader(doc.ToString()));
var xml = new SqlXml(reader);
using (var connection = new SqlConnection(_connectionString))
{
using (var command = new SqlCommand("insert into XmlTable (dat) values(@data)", connection))
{
command.Parameters.Add(new SqlParameter("@data", SqlDbType.Xml){Value = xml});
connection.Open();
command.ExecuteNonQuery();
}
}
一切正常,插入行。但是,如果我运行 SQL 事件探查器并检查插入命令,则会看到以下内容:
declare @p3 xml
set @p3=convert(xml,N'<root><abc>123</abc><cba>321</cba></root>')
exec sp_executesql N'insert into XmlTable (dat) values(@data)',N'@data xml',@data=@p3
我们可以看到,尽管将SqlXml
类型传递到查询中SqlClient
执行从字符串到 XML 的不必要的转换。XML解析器确实浪费了工作。
问题是:SqlClient
为什么要这样做?我怎样才能在没有额外转换的情况下做到这一点?
reallity 中没有发生对话。你看到的是探查器/跟踪的项目,必须以某种方式将 TDS RPC 调用表示为 T-SQL 批处理,你可以复制粘贴并在 SSMS 中执行。执行的实际文本只是insert into XmlTable (dat) values(@data)
@data
类型/值来自请求的ParamData
部分。与任何有线协议一样,序列化和编码必须在客户端中进行,解码和反序列化必须在服务器上进行。作为旁注,也没有调用sp_execute_sql
,这又是探查器/跟踪如何显示 RPC 调用的工件。
此代码用于高负载场景,额外的转换使其变慢
这是猜测。性能分析应基于测量和观测值。