如何从SQL CLR函数打印消息?

时间:2009-01-29 19:18:01

标签: sql-server debugging trace sqlclr

是否等同于

PRINT 'hello world'

可以从CLR(C#)代码调用吗?

我正在尝试在我的函数中输出一些调试信息。我无法运行VS调试器,因为这是一个远程服务器。

谢谢!

4 个答案:

答案 0 :(得分:30)

答案是你不能做相同的

PRINT 'Hello World'

来自[SqlFunction()]。但是,您可以使用<{p>}从[SqlProcedure()]进行操作

SqlContext.Pipe.Send("hello world")

这与T-SQL一致,如果你在一个函数中粘贴一个PRINT,你会得到错误“在一个函数中无效使用副作用运算符'PRINT'”。但是如果你从存储过程中执行它,那就不行了。

对于解决方法,我建议:

  1. 从您的代码中使用 Debug.Print ,并将调试器附加到SQL Server(我知道这对您来说并不像您所解释的那样)。
  2. 将消息保存在全局变量中,例如List<string> messages,并编写另一个返回messages内容的表值函数。当然,需要同步对messages的访问,因为多个线程可能会同时尝试访问它。
  3. 将您的代码移至[SqlProcedure()]
  4. 添加一个参数'debug',当= 1时,该函数将返回消息作为返回表的一部分(假设有一个带有文本的列..)

答案 1 :(得分:10)

你应该能够做到:

SqlContext.Pipe.Send("hello world");

如果您在CLR UDF中运行此功能,SqlContext.Pipe将始终为null。没有有效的SqlPipe,我不相信你能做你想做的事。

如果这纯粹是出于调试目的,您可以随时在托管代码中打开文件并在那里编写输出。这要求您的程序集具有EXTERNAL_ACCESS权限,但这反过来要求将数据库标记为可信任。不一定是我会做或推荐的。

答案 2 :(得分:2)

啊,我明白了... Jsut澄清:如果你有一个 SqlFunction 那么SqlContext.Pipe不可用,但是在 SqlProcedure 中它是,你可以使用发送()写信息。

除了异常消息之外,我还没有找到从SqlFunction输出信息的方法。

答案 3 :(得分:1)

您可以尝试通过“xp_logevent”存储过程放置这些信息。 您可以将调试信息设置为不同级别的“信息”,“警告”或“错误”。 我还尝试将这些调试/错误信息放入事件日志中,但这需要在安全性方面进行一些配置,我怀疑我不能在生产中使用它。