Ich habe viele Datenbanken in meinem SQL Server.
Ich muss nur nach Datenbanknamen suchen, die einen bestimmten Tabellennamen enthalten. Heartbitmaster
Ich habe viele Datenbanken wie Gotgold
, DVD
usw. und ich möchte nur Datenbanknamen aus der Abfrage finden, die diese Tabelle Heartbitmaster
enthalten.
Ich suchte ich suchte nach Abfrage:
SELECT
TABLE_NAME
FROM
INFORMATION_SCHEMA.TABLES
WHERE
TABLE_TYPE = 'base table'
AND table_schema = 'Heartbitmaster'
aber es hat nicht funktioniert.
Ich suchte weiter und stieß auf:
SELECT name, database_id, create_date
FROM sys.databases
aber ich weiß nicht, wie ich die Bedingungen für die Suche nach Tabellennamen weiter anordnen soll
Bitte hilf mir.
Ich habe es durch folgende Abfrage gemacht:
SELECT name FROM sys.databases WHERE CASE
WHEN state_desc = 'ONLINE'
THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[heartbit]', 'U')
END IS NOT NULL
sp_MSforeachdb 'SELECT "?" AS DB, * FROM [?].sys.tables WHERE name like ''%tablename%'''
probier diese
Ich brauchte etwas anderes.
Dadurch werden alle Tabellen und ihre entsprechenden DBs mit Namen zurückgegeben, die die angegebene Zeichenfolge enthalten:
SELECT TABLE_NAME, TABLE_SCHEMA
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME like '%_<insert_name_here>';
Wenn Sie Datenbankobjekte (z. B. Tabellen, Spalten, Trigger) anhand des Namens suchen müssen, werfen Sie einen Blick auf das FREE Red-Gate-Tool namens SQL Search , das die gesamte Datenbank durchsucht für jede Art von String (s).
Es ist ein großartiges Muss für jeden DBA- oder Datenbank-Entwickler. Habe ich bereits erwähnt, dass es absolut FREE ist, um für jede Art von Verwendung verwendet zu werden?
Was INFORMATION_SCHEMA
oder die SQL Server-spezifischen Katalogsichten betrifft: Soweit ich weiß, sind diese immer auf die aktuelle Datenbank beschränkt, in der Sie sich befinden. Sie können also nicht alle Datenbanken auf Ihrem Server durchsuchen. SQL Search erledigt dies für Sie - indem Sie jede einzelne Datenbank auf dem Server durchsuchen.
Verfahren wie unten beschrieben
CREATE PROCEDURE usp_FindTableNameInAllDatabase
@TableName VARCHAR(256)
AS
DECLARE @DBName VARCHAR(256)
DECLARE @varSQL VARCHAR(512)
DECLARE @getDBName CURSOR
SET @getDBName = CURSOR FOR
SELECT name
FROM sys.databases
CREATE TABLE #TmpTable (DBName VARCHAR(256),
SchemaName VARCHAR(256),
TableName VARCHAR(256))
OPEN @getDBName
FETCH NEXT
FROM @getDBName INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @varSQL = 'USE ' + @DBName + ';
INSERT INTO #TmpTable
SELECT '''+ @DBName + ''' AS DBName,
SCHEMA_NAME(schema_id) AS SchemaName,
name AS TableName
FROM sys.tables
WHERE name LIKE ''%' + @TableName + '%'''
EXEC (@varSQL)
FETCH NEXT
FROM @getDBName INTO @DBName
END
CLOSE @getDBName
DEALLOCATE @getDBName
SELECT *
FROM #TmpTable
DROP TABLE #TmpTable
GO
EXEC usp_FindTableNameInAllDatabase 'Address'
GO
exec usp_FindTableNameInAllDatabase 'user'
Es klappt!!!!!!!
Führen Sie diese Abfrage aus, um den Datenbanknamen für eine bestimmte Tabelle zu finden. Der Name der Einfügetabelle in @ Tabellenname
Löschen Sie die Tabelle #tempo für die nächste Ausführung
declare @tablename varchar(max) = 'patient'
declare @count int = (select max(database_id) FROM sys.databases)
declare @n int = 1
declare @dbname varchar(max)
declare @query nvarchar(max)
create table #tempo(Databasename varchar(max), tablename varchar(max))
while @n <= @count
begin
select @dbname = name from sys.databases where database_id = @n and service_broker_guid <> '00000000-0000-0000-0000-000000000000'
set @query = 'insert into #tempo(Databasename,tablename) select '''[email protected]+''' [Database],name from '[email protected]+'.sys.tables where name like ''%'[email protected]+'%'''
exec(@query)
set @[email protected]+1;
end
select * from #tempo
Beim letzten Fehler wie
Die Datenbank 'Datenbankname' kann nicht geöffnet werden, da sie offline ist.
führen Sie dann diese Abfrage separat aus
select * from #tempo