是否等同于
PRINT 'hello world'
可以从CLR(C#)代码调用吗?
我正在尝试在我的函数中输出一些调试信息。我无法运行VS调试器,因为这是一个远程服务器。
谢谢!
答案 0 :(得分:30)
答案是你不能做相同的
PRINT 'Hello World'
来自[SqlFunction()]
。但是,您可以使用<{p>}从[SqlProcedure()]
进行操作
SqlContext.Pipe.Send("hello world")
这与T-SQL一致,如果你在一个函数中粘贴一个PRINT,你会得到错误“在一个函数中无效使用副作用运算符'PRINT'”。但是如果你从存储过程中执行它,那就不行了。
对于解决方法,我建议:
List<string> messages
,并编写另一个返回messages
内容的表值函数。当然,需要同步对messages
的访问,因为多个线程可能会同时尝试访问它。[SqlProcedure()]
答案 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”存储过程放置这些信息。 您可以将调试信息设置为不同级别的“信息”,“警告”或“错误”。 我还尝试将这些调试/错误信息放入事件日志中,但这需要在安全性方面进行一些配置,我怀疑我不能在生产中使用它。