问题
I'm looking for a way to select all databases on my sql server, which only contain the table "dbo.mytable"
How can i do this ?
I already have these two sql queries :
Select name From sys.databases Where database_id > 5
And
IF EXISTS
(SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[mytable]') AND type in (N'U'))
Select 1 [Exists]
Else
Select 0 [Exists]
The first query, lists all databases on my sql server, and the second checks if dbo.mytable exists. I would like to merge them.
Thanks
回答1:
A concise way that brings them all back in one resultset is
SELECT name
FROM sys.databases
WHERE CASE
WHEN state_desc = 'ONLINE'
THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[mytable]', 'U')
END IS NOT NULL
回答2:
You can use sp_Msforeachdb that is an undocumented Stored procedure and run on all databases :
EXEC sp_Msforeachdb "use [?];select * from sys.tables where name='MYTable' "
more about sp_msforeachtable : The undocumented sp_MSforeachdb procedure
回答3:
Return list of databases, which contains the specified table -
Query:
DECLARE
@SQL NVARCHAR(MAX)
, @table_name SYSNAME
SELECT @table_name = 'dbo.test'
IF OBJECT_ID('tempdb.dbo.#db_temp') IS NOT NULL
DROP TABLE #db_temp
CREATE TABLE #db_temp (db_nm SYSNAME)
SELECT @SQL = (
SELECT '
USE [' + d.name + '];
INSERT INTO #db_temp (db_nm)
SELECT DB_NAME()
WHERE EXISTS(
SELECT 1
FROM sys.objects
WHERE [object_id] = OBJECT_ID(''' + @table_name + ''')
AND [type] = ''U''
)'
FROM sys.databases d
WHERE d.name NOT IN ('master', 'tempdb', 'model', 'msdb')
AND d.state_desc != 'OFFLINE'
FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)')
EXEC sys.sp_executesql @SQL
SELECT *
FROM #db_temp dt
Output:
USE [...];
INSERT INTO #db_temp (db_nm)
SELECT DB_NAME()
WHERE EXISTS(
SELECT 1
FROM sys.objects
WHERE [object_id] = OBJECT_ID('...')
AND [type] = 'U'
)
...
来源:https://stackoverflow.com/questions/16519663/select-databases-which-only-contain-specific-table