从 sp_executesql 中获取多个结果
Get multiple results from sp_executesql
请看下面的声明:
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
该语句生成两个表的输出。是否可以将结果插入两个临时表而不是输出结果集?
或者(甚至更好)完全忽略结果?
背景:
我正在编写一些通用代码来检查 "compile-errors" 的存储过程:它执行所有读取存储过程并检查是否出现任何错误(例如丢失的列或不可能的执行计划)。因此实际上,@stmt 将包含存储过程的调用(不能拆分为两个单独的语句)。这工作得很好,但我不喜欢代码输出一百多个表的事实...
编辑:经过长时间的讨论,解决了这个问题:
Syntax check all stored procedures?
--如果对讨论感兴趣,请阅读本文和评论...
你的方法闻起来像个很糟糕的主意...
您可以想到一个 table "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')
请看下面的声明:
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
该语句生成两个表的输出。是否可以将结果插入两个临时表而不是输出结果集? 或者(甚至更好)完全忽略结果?
背景:
我正在编写一些通用代码来检查 "compile-errors" 的存储过程:它执行所有读取存储过程并检查是否出现任何错误(例如丢失的列或不可能的执行计划)。因此实际上,@stmt 将包含存储过程的调用(不能拆分为两个单独的语句)。这工作得很好,但我不喜欢代码输出一百多个表的事实...
编辑:经过长时间的讨论,解决了这个问题: Syntax check all stored procedures?
--如果对讨论感兴趣,请阅读本文和评论...
你的方法闻起来像个很糟糕的主意...
您可以想到一个 table "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')