请看下面的语句:
CREATE TABLE TableA (A INT)
CREATE TABLE TableB (B INT, C INT)
DECLARE @stmt NVARCHAR(MAX) = 'SELECT * FROM TableA; SELECT * FROM TableB'
EXEC sp_executesql @stmt
语句生成两个表的输出。是否可以将结果插入到两个临时表中,而不是输出结果集?或者(更好的)完全忽略结果?
背景:我正在编写一些通用代码来检查存储过程的"编译错误":它执行所有读取存储过程并检查是否出现任何错误(例如缺少列或不可能的执行计划)。因此,在现实中,@stmt将包含对存储过程的调用(存储过程不能拆分为两个单独的语句)。这工作得很好,但我不喜欢代码输出超过100个表的事实…编辑:经过长时间的讨论,解决了这个问题:语法检查所有存储过程?
——如果对讨论感兴趣,请阅读这篇文章并发表评论…
你的方法闻起来像一个非常糟糕的主意…
你可以考虑一个表"CompileErrors",其中包含SessionID, SessionDate和一个XML列"Results"。
您的SP可以通过在末尾添加" for XML AUTO"轻松地将所有SELECT结果(每次调用一行)插入到该XML列中。
使用"FOR XML PATH"可以详细控制输出。
比较一下这两个:
SELECT TOP 10 [name],object_id,schema_id,[type]
FROM sys.objects
FOR XML AUTO, ROOT('objects')
SELECT TOP 10 object_id AS [@object_id]
,schema_id AS [@schema_id]
,[type] AS [@type]
,[name]
FROM sys.objects
FOR XML PATH('object'),ROOT('objects')