2016-04-06 3 views
0

Sortieren von verwandten meiner previous question:SQL Server: Ausgabe alle Spaltendetails für alle Tabellen in eine Datei

Ich mag würde Liste aller Spalte Details für alle Tabellen in einer SQL Server-db ausgegeben wird. Dies verwendet die Daten aus sys.columns. Also begann ich mit so etwas wie:

use mydb 
EXECUTE sp_MSforeachtable 
    'EXECUTE master.dbo.xp_cmdshell ''sqlcmd -S MYPC\SQLEXPRESS -E -d mydb -q "select * from sys.columns where object_id = object_id(?)" -W -o C:\TEMP\?.txt -s"|"''' 

habe ich sogar versucht, mit Ersatz der where-Klausel mit where object_id = object(''mydb.?'')

+0

Dieser Befehl listet nur alle Spalten. – FLICKER

+0

Das möchte ich in Dateien ausgeben; Alle sys.columns-Daten für alle Tabellen in separaten Dateien. –

+0

Aber Sie haben gesagt "Ausgabe Tabellenschema für alle Tabellen" !! Möchten Sie ein Tabellenschema wie CREATE TABLE generieren? oder möchten Sie nur alle Spalten auflisten? – FLICKER

Antwort

0

Versuchen INFORMATION_SCHEMA.COLUMNS statt sys.columns

SELECT 
    TABLE_CATALOG, 
    TABLE_SCHEMA, 
    TABLE_NAME, 
    COLUMN_NAME, 
    DATA_TYPE, 
    CHARacter_maximum_length 'Max Length' 
FROM INFORMATION_SCHEMA.columns 
GO 

Es gibt noch weitere Spalten mit aber diese werden dich beginnen.

Sie können auch osql (Link) verwenden, um Ihren Befehl über eine Windows-Befehlszeile auszuführen.

EX: (Ersetzen MASTER mit dem Datenbanknamen und geben Sie die Abfrage, die Sie anstelle der Tabellen-Abfrage verwenden möchten

osql -E -S . -d MASTER -q "SELECT NAME FROM SYS.TABLES" -o tables.txt 

Update 1:.

Wenn Sie mit Probleme, das Schema aus dem sp_MSforeachtable Befehl zu entfernen versuchen, diese:

exec sp_MSforeachtable @command1 = 'select * from INFORMATION_SCHEMA.columns where 
table_name = REPLACE(REPLACE(''?'',''[dbo].['',''''),'']'','''')' 

, dass Sie geben nur den Tabellennamen ohne die [ dbo]. und die nachlaufende Klammer.

Update 2:

Wenn Sie die object_id stattdessen könnte man versuchen, dies nutzen wollten:

exec sp_MSforeachtable @command1 = 'select * from sys.columns 
where object_id = (SELECT OBJECT_ID(''?''))' 
+0

Danke @jjoiner. MSforeachtable wählt alle Tabellen als 'dbo.tablename' aus. Wenn ich also einen Befehl wie 'select * from sys.columns where object_id = object_id (?)' Ausfühle, beschwert er sich darüber, keine mehrteilige Kennung zu finden. Ich denke, object_id würde nur den Tabellennamen, nicht die mehrteilige Kennung erwarten. Ich habe sogar etwas lächerlich wie ein Ersatz (?, 'Dbo.', '') Versucht. Und danke für den Vorschlag, osql zu verwenden. –

+0

Ich habe die Antwort @RudyM aktualisiert, um eine Möglichkeit zu enthalten, das Schema von Ihrem Befehl zu entfernen. – jjoiner

+0

Versuchen Sie object_id = (SELECT OBJECT_ID (''? '')) '@RudyM – jjoiner

Verwandte Themen