我正在使用SQL Server 2000,并希望编写一个简单的查询,以在equipmentpropertyid
中返回不包含defs_equipmentpropertytable
数字大于905的所有数据库的名称。我们有一百个或更多活动数据库都包含相同的表。不幸的是,defs_equipmentpropertytable
在大多数数据库中都是最新的,但不是全部。我需要弄清楚哪些数据库需要更新特定的表。我们有一个搜索所有数据库的工具,我只需要正确的查询语法。
有人可以帮忙吗?
感谢。
答案 0 :(得分:0)
有人可能会提到未记录的存储过程sp_msforeachdb,它可以执行此操作。但是,我建议你自己编写一个查询来生成SQL,然后运行它。这样的事情应该有效:
declare @query nvarchar(400);
set @query = N'
select top 1 ''Found in '' + %%% as r
from $$$.dbo.defs_equipmentpropertytable
where equipmentpropertyid > 905
go
';
select replace(replace(@query,'$$$',quotename(name)),'%%%',quotename(name,''''))
from master..sysdatabases
运行此命令,然后将结果复制回查询窗口并执行结果。您还可以过滤掉您不想要的任何数据库。
我强烈建议使用它而不是sp_MSforeachdb,因为这使您有机会在运行之前检查SQL,这是避免SQL注入的好习惯,更不用说错误了。
我倒退了。这有用吗?
declare @query nvarchar(400);
set @query = N'
if not exists (
select *
from $$$.dbo.defs_equipmentpropertytable
where equipmentpropertyid > 905
) select %%% + 'is not up to date' as r
go
';
select replace(replace(@query,'$$$',quotename(name)),'%%%',quotename(name,''''))
from master..sysdatabases
答案 1 :(得分:0)
如果该工具为您搜索所有内容,则此查询应该可以满足您的需求;如果MAX propertyid< = 905,它将返回数据库名称。
SELECT DB_NAME() as DatabaseName
FROM dbo.defs_equipmentpropertytable
HAVING MAX(equipmentpropertyid) <= 905
希望这能满足您的需求。如果您的数据库抓取工具无法使用此功能,您当然可以使用Steve提供的方法。