执行sp_Blitz筛选低优先级结果时INSERT EXEC报错,求解决方法
解决sp_Blitz嵌套INSERT EXEC报错+筛选优先级≤100结果的方案
优先用:sp_Blitz自带的输出表参数(最优解)
sp_Blitz本身就支持直接把结果写到指定表,完全不用INSERT EXEC,从根源避免嵌套报错,步骤如下:
- 先建个存结果的表(永久表、全局临时表都行,这里用永久表举例):
CREATE TABLE dbo.BlitzResults( Priority INT, FindingsGroup VARCHAR(100), Finding VARCHAR(255), DatabaseName SYSNAME, URL VARCHAR(255), Details VARCHAR(MAX), QueryPlan VARCHAR(255), QueryPlanFiltered VARCHAR(255), CheckID INT );
- 调用sp_Blitz时指定输出表参数,让它直接把数据写进去:
EXEC sp_Blitz @OutputDatabaseName = '你的数据库名', -- 替换为实际要存储的数据库名称 @OutputSchemaName = 'dbo', @OutputTableName = 'BlitzResults';
- 直接筛选优先级≤100的结果:
SELECT * FROM dbo.BlitzResults WHERE Priority <= 100;
要是不想保留永久表,用全局临时表(名字开头加##)就行,会话结束后会自动清理:
CREATE TABLE ##BlitzTempResults( Priority INT, FindingsGroup VARCHAR(100), Finding VARCHAR(255), DatabaseName SYSNAME, URL VARCHAR(255), Details VARCHAR(MAX), QueryPlan VARCHAR(255), QueryPlanFiltered VARCHAR(255), CheckID INT ); EXEC sp_Blitz @OutputDatabaseName = 'tempdb', @OutputSchemaName = 'dbo', @OutputTableName = '##BlitzTempResults'; SELECT * FROM ##BlitzTempResults WHERE Priority <= 100; -- 可选:手动清理临时表,不执行的话会话结束也会自动删除 DROP TABLE ##BlitzTempResults;
备选:用OPENQUERY绕开嵌套限制
如果你的sp_Blitz版本过老,没有输出表参数,就用OPENQUERY结合本地服务器链接来绕过嵌套限制:
- 先创建本地服务器链接(只需执行一次):
EXEC sp_addlinkedserver @server = 'LOCALHOST', @srvproduct = '', @provider = 'SQLNCLI', @datasrc = @@SERVERNAME;
- 通过OPENQUERY执行sp_Blitz并插入临时表:
CREATE TABLE #reports( Priority INT, FindingsGroup VARCHAR(100), Finding VARCHAR(255), DatabaseName SYSNAME, URL VARCHAR(255), Details VARCHAR(MAX), QueryPlan VARCHAR(255), QueryPlanFiltered VARCHAR(255), CheckID INT ); INSERT INTO #reports SELECT * FROM OPENQUERY(LOCALHOST, 'EXEC 你的数据库名.dbo.sp_Blitz'); SELECT * FROM #reports WHERE Priority <= 100; DROP TABLE #reports;
不推荐:将存储过程改为表值函数
如果你有权限修改sp_Blitz的代码(但你提到无法查看元数据,所以此方法仅作参考),可以把存储过程重构为表值函数,这样就能直接SELECT并筛选结果:
-- 仅为逻辑示例,实际需对应sp_Blitz内部业务逻辑 CREATE FUNCTION dbo.fn_Blitz() RETURNS @Results TABLE( Priority INT, FindingsGroup VARCHAR(100), Finding VARCHAR(255), DatabaseName SYSNAME, URL VARCHAR(255), Details VARCHAR(MAX), QueryPlan VARCHAR(255), QueryPlanFiltered VARCHAR(255), CheckID INT ) AS BEGIN -- 将sp_Blitz内部逻辑迁移至此,将结果插入@Results表变量 RETURN; END; -- 调用函数并直接筛选 SELECT * FROM dbo.fn_Blitz() WHERE Priority <= 100;
内容的提问来源于stack exchange,提问作者Db-learner
相关产品推荐
相关产品推荐

