访问从 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的主要内容,如果未能解决你的问题,请参考以下文章