2016-04-15 14 views
0

Ich versuche eine Abfrage zu schreiben, die für eine einzelne SQL Server-Instanz alle Spalten in allen Tabellen in allen Datenbanken der Serverinstanz auflistet. Ich habe Beispiele gefunden, die alle Spalten in allen Tabellen auflisten, aber Sie müssen den Datenbanknamen kennen. Ich habe Beispiele gefunden, die Datenbanken auf einer SQL Server-Instanz, aber nicht die Tabellen in den Datenbanken auflisten. Jetzt versuche ich etwas zu finden, das die beiden verbindet, aber ich habe nicht viel Glück.Auflisten aller Datenbanken, aller Tabellen und aller Spalten in einer SQL Server-Instanz

Würde jemand wissen, ob so etwas existiert oder ist es ein manueller Prozess, um die Lücke zu überbrücken?

Danke,

Tom

Antwort

0

können Sie dynamische Abfrage verwenden. Ich habe keinen anderen Weg gefunden.

declare @str varchar(max) = '' 
;with dbs as (
select * 
from sys.databases 
where dbs.name not in ('master', 'tempdb', 'model', 'msdb') 
) 
select @str = @str + 'select ''' + dbs.name + ''', tbl.name, col.name from ' + 
    dbs.name + '.sys.tables tbl inner join ' + 
    dbs.name + '.sys.columns col ON col.object_id = tbl.object_id; ' 
from dbs 

print @str 
exec(@str) 
0

Bitte versuchen Sie es und kommentieren Sie mit Kommentaren.

Die Anforderung bestand darin, eine bestimmte Tabelle aus der gesamten Datenbank herauszufinden. Dies war bei visueller Inspektion nicht möglich, da es viel Zeit in Anspruch nehmen konnte und menschliche Fehler möglich waren. Sie kannte die Systemansicht sys.tables.

SELECT * 
FROM sys.Tables 
WHERE name LIKE '%Address%' 

Die Begrenzung der Abfrage oben erwähnt ist, dass es nur in einer Datenbank sucht und Benutzerdatenbank manuell und führen Sie die Abfrage über die Änderung wieder zu halten hat. Ich schrieb folgendes Schnellskript auf, das in die gesamte Datenbank auf dem Server schaut und den Datenbanknamen, den Schemanamen und die Tabelle mit dem gesuchten Wort in seinem Namen angibt.

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 
Verwandte Themen