【问题标题】:How to store MSSQL PRINT output to a variable如何将 MSSQL PRINT 输出存储到变量中
【发布时间】:2012-05-11 18:31:47
【问题描述】:

在 MS SQL 2008 R2 上,我希望能够将消息输出捕获到变量中。我需要在许多数据库上运行脚本。捕获消息输出(来自 print 或 raiserror 的消息)并将其记录到表中。我需要从存储过程内部执行此操作。

对于这个脚本

Declare @sqlscript nvarchar(500)

Set @sqlscript = 
'select * from sys.objects
raiserror (''My raised error'', 10,1)
select * from sys.schemas
print ''my print'''

EXEC sp_executesql @sqlscript

我想得到

My raised error    
my print

(60 row(s) affected)  
My raised error

(21 row(s) affected)  
my print

更新
我决定接受@rs 的建议。登录到表格对我来说是最简单的方法。使用 SP 记录(以保持代码干净),加上一个小的正则表达式来重构我的所有脚本。解决方案将在明天准备就绪。非常感谢。

【问题讨论】:

  • 在你的 exec 语句后检查 @@error, @@rowcount 例如:SELECT @@rowcount
  • 在 sp_executesql 之后,@@error 和 @@rowcount 都为 0,因为最后一个语句是打印。它只会给我最后一条语句的信息,而不是执行的整个脚本。
  • 你能用插入表格代替打印吗?将print 'my print' 替换为insert into logtable (msg) values ('print')
  • 是的,我可以用日志表或我要附加的 nvarchar(max) 变量替换打印。但是我有大约 75 个脚本,我希望不必重构它们。 :D Plus 使用 Print 是跟踪的标准。我可以改变我的习惯,它的团队会更不愿意改变。
  • @rs:你应该用你的评论来回答,这样他才能接受。

标签: sql sql-server sql-server-2008


【解决方案1】:

您可能可以使用 CLR 和类似的技术:

http://blogs.msdn.com/b/mattm/archive/2007/09/13/capture-print-messages-from-a-stored-procedure.aspx

但最好的选择可能是 EXEC 到一个只有一个 varchar 列的临时表中:

http://msdn.microsoft.com/en-us/library/aa175921%28v=sql.80%29.aspx

【讨论】:

  • CLR 不是一个选项,我们托管在一个服务器上,它没有为我们提供正确的凭据来使用 CLR 和 EXEC 选项我刚刚测试过但我不能让它起作用。我可以从存储过程中获得结果,但不能从消息中获得。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-09
  • 2018-01-27
  • 2023-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多