【问题标题】:Access SqlXml returned from SQLCLR stored procedure in SQL Server访问从 SQL Server 中的 SQLCLR 存储过程返回的 SqlXml
【发布时间】: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。

【问题讨论】:

    标签: c# sql .net xml sqlclr


    【解决方案1】:

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

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

    EXEC dbo.spGetXmlForFile @OutParamName = @ResultForPos OUTPUT;
    

    【讨论】:

    • 请给我一个简单的例子。当我传入一个 Out 参数时,我仍然得到同样的错误。谢谢。
    • @Abe 如果您遇到同样的错误,那么您仍在使用EXEC @ResultForPos = spGetXmlForFile 语法,因为存储过程只返回INT,所以它无法工作。我已经用预期的语法更新了我的答案。
    • @Abe 你能在这方面做得更进一步吗?
    猜你喜欢
    • 2016-11-03
    • 2014-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-11
    • 2010-11-23
    相关资源
    最近更新 更多