2009-08-12 203 views
0

我使用SQL Server 2000和想寫一個簡單的查詢返回不包含在defs_equipmentpropertytableequipmentpropertyid數905以上所有數據庫的名稱。我們有一百個或更多的活動數據庫都包含相同的表。不幸的是,defs_equipmentpropertytable是跟上時代的大多數數據庫,但不是全部。我需要弄清楚哪些數據庫需要更新該特定的表。我們有一個工具可以搜索所有的數據庫,我只需要查詢的正確語法。搜索數據庫

任何人都可以幫忙嗎?

謝謝。

回答

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,這是避免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 
+0

這個工程提供的是最新的數據庫列表。我需要那些不是最新的數據庫......那些我需要修復的數據庫。我有所有數據庫中進行搜索的工具,我需要的只是正確的語法......例如:如果不存在(SELECT * FROM defs_equipmentpropertytable其中equipmentpropertyid> 905)...這是行不通的。 – 2009-08-12 20:11:35

+0

我想我已經倒過來了。第二個查詢是否創建了正確的查詢來運行? – 2009-08-13 06:43:35

0

該查詢應該做你需要什麼,如果該工具的所有爲你的搜索;如果MAX propertyid < = 905,它將返回數據庫名稱。

SELECT DB_NAME() as DatabaseName 
FROM dbo.defs_equipmentpropertytable 
HAVING MAX(equipmentpropertyid) <= 905 

希望得到您需要的。如果您的數據庫抓取工具無法正常工作,您當然可以使用Steve提供的方法。