我在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语句中进入?一旦条件不满足,它不应该终止吗?我该如何处理这种情况?
答案 0 :(得分:2)
这是因为SQL Engine尝试编译代码,因此它会检查IF块内的代码。
您必须在存储过程之外使用该比较,例如在您的SET @sql ='......'命令中,但如果该列不存在则不会运行该SP。
所以你可以尝试别的东西 - 在SP中构建查询(nvarchar变量)并将其作为动态SQL执行。