我使用SQL Server 2000和想寫一個簡單的查詢返回不包含在defs_equipmentpropertytable
equipmentpropertyid
數905以上所有數據庫的名稱。我們有一百個或更多的活動數據庫都包含相同的表。不幸的是,defs_equipmentpropertytable
是跟上時代的大多數數據庫,但不是全部。我需要弄清楚哪些數據庫需要更新該特定的表。我們有一個工具可以搜索所有的數據庫,我只需要查詢的正確語法。搜索數據庫
任何人都可以幫忙嗎?
謝謝。
我使用SQL Server 2000和想寫一個簡單的查詢返回不包含在defs_equipmentpropertytable
equipmentpropertyid
數905以上所有數據庫的名稱。我們有一百個或更多的活動數據庫都包含相同的表。不幸的是,defs_equipmentpropertytable
是跟上時代的大多數數據庫,但不是全部。我需要弄清楚哪些數據庫需要更新該特定的表。我們有一個工具可以搜索所有的數據庫,我只需要查詢的正確語法。搜索數據庫
任何人都可以幫忙嗎?
謝謝。
有人可能會提到無證存儲過程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
該查詢應該做你需要什麼,如果該工具的所有爲你的搜索;如果MAX propertyid < = 905,它將返回數據庫名稱。
SELECT DB_NAME() as DatabaseName
FROM dbo.defs_equipmentpropertytable
HAVING MAX(equipmentpropertyid) <= 905
希望得到您需要的。如果您的數據庫抓取工具無法正常工作,您當然可以使用Steve提供的方法。
這個工程提供的是最新的數據庫列表。我需要那些不是最新的數據庫......那些我需要修復的數據庫。我有所有數據庫中進行搜索的工具,我需要的只是正確的語法......例如:如果不存在(SELECT * FROM defs_equipmentpropertytable其中equipmentpropertyid> 905)...這是行不通的。 – 2009-08-12 20:11:35
我想我已經倒過來了。第二個查詢是否創建了正確的查詢來運行? – 2009-08-13 06:43:35