在所有数据库中运行过程

时间:2016-08-28 23:36:30

标签: sql-server tsql stored-procedures

我在Master数据库中创建了一个系统存储过程,可以在所有数据库中运行。我想在所有数据库中同时运行它,这里我使用的是:

use Master
GO

declare @sql nvarchar(1000)

SET @sql = 'USE [?]; EXEC [dbo].[sp_procedure]'

EXEC sp_MSforeachdb @sql

问题是 - 并非所有数据库都有类似的表和列结构。所以在内部程序中,我在做任何计算之前这样做:

if exists(select 1 
          from 
              INFORMATION_SCHEMA.TABLES b,
              INFORMATION_SCHEMA.COLUMNS c
          where 
              b.TABLE_TYPE = 'BASE TABLE' 
              and b.TABLE_NAME = 'tablename'
              and c.TABLE_NAME = b.TABLE_NAME
              and c.COLUMN_NAME = 'columnname')

因此,如果在跨所有数据库运行时,没有名为'tablename'且列名为“columnname”的表,则应跳过该数据库的过程并继续下一个数据库。我有一个数据库,其中包含'tablename'表,但该表中没有'columnname'列,并返回此错误:

  

列名称'columnname'无效。

为什么if exists语句在if语句中进入?一旦条件不满足,它不应该终止吗?我该如何处理这种情况?

1 个答案:

答案 0 :(得分:2)

这是因为SQL Engine尝试编译代码,因此它会检查IF块内的代码。

您必须在存储过程之外使用该比较,例如在您的SET @sql ='......'命令中,但如果该列不存在则不会运行该SP。

所以你可以尝试别的东西 - 在SP中构建查询(nvarchar变量)并将其作为动态SQL执行。