访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml

Posted

技术标签:

【中文标题】访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml【英文标题】:Access SqlXml returned from SQLCLR stored procedure in SQL Server 【发布时间】:2017-09-07 01:45:14 【问题描述】:

我有一些 C# 代码 (SQLCLR) 从本地机器读取 XML 文件到流中,并将其作为 SQLXML 返回给 SQL:

C#代码

 Stream str = File.OpenRead(xmlFilePath);
 sqlXMLToReturn = new SqlXml(str);

从 SQL Server 2014 调用 SQL CLR:

DECLARE @ResultForPos xml
EXEC @ResultForPos = spGetXmlForFile
SELECT @ResultForPos

当我从 Visual Studio 2015 中的 SQL Server 对象资源管理器中调试上述 SQL 脚本时,我在 C# 代码中的断点被命中。C# 代码中没有引发异常。但是在运行脚本后,我在 SQL Server 中收到以下错误。

消息 206,级别 16,状态 2,过程 spWcfCall,第 43 行 操作数类型冲突:int 与 xml 不兼容

我做错了什么?我是否必须执行 sqlXMLToReturn.Value 并返回一个字符串而不是 SQLXML。

【问题讨论】:

【参考方案1】:

存储过程,无论是纯 T-SQL 还是 SQLCLR,总是返回 INT / SqlInt32。如果要回传XML / SqlXml,则需要使用OUTPUT / out / ref 参数。

最后,语法应该类似于以下内容:

EXEC dbo.spGetXmlForFile @OutParamName = @ResultForPos OUTPUT;

【讨论】:

请给我一个简单的例子。当我传入一个 Out 参数时,我仍然得到同样的错误。谢谢。 @Abe 如果您遇到同样的错误,那么您仍在使用EXEC @ResultForPos = spGetXmlForFile 语法,因为存储过程只返回INT,所以它无法工作。我已经用预期的语法更新了我的答案。 @Abe 你能在这方面做得更进一步吗?

以上是关于访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml的主要内容,如果未能解决你的问题,请参考以下文章

基于SQL Server版本的SQL CLR条件编译

引用 SQL 数据库项目 (SQLCLR) 引发“找不到类型或命名空间”错误

SQL触发器调用.NET的类方法续SQLCLR应用

无法连接到 SQLCLR 中的外部数据库

需要从 SQL Server 中的另一个表访问用户名

SQL CLR 中的多线程缓存