我有一个关于将xml数据类型传递给C#代码查询的问题。
首先,这是SQL Server上的表格:
CREATE TABLE [dbo].[XmlTable]( [id] [int] IDENTITY(1,1) NOT NULL, [dat] [xml] NOT NULL )
其次,我有一个用C#编写的应用程序。然后将行插入到XmlTable应用程序中
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事件探查器并检查insert命令,则会看到以下内容:
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解析器确实浪费了工作。
SqlXml
SqlClient
问题是:为什么SqlClient要这样做?而我该如何做而无需额外转换?
实际上没有对话发生。您所看到的是Profiler / Trace的工件,它必须以某种方式将TDSRPC调用表示为T-SQL批处理,您可以复制粘贴并在SSMS中执行。执行的 实际 文本是公正的insert into XmlTable (dat)values(@data),@data类型/值来自ParamData请求的一部分。与 任何 有线协议一样,序列化和编码必须在客户端中进行,而解码和反序列化则必须在服务器中进行。附带说明一下,没有任何一个调用sp_execute_sql,这再次是Profiler/ Trace如何显示RPC调用的构件。
insert into XmlTable (dat)values(@data)
@data
ParamData
sp_execute_sql
此代码在高负载情况下使用,附加转换使其速度变慢
那是猜测。您应该基于测量和观察来进行性能分析。