2013-07-08 8 views
7

C'è un modo per creare uno schema XML da un database esistente in SQL Server 2008, SQL Server Management Studio?come creare uno schema XML da un database esistente in SQL Server 2008

Ho un DB con ~ 50 tabelle. Sto cercando di creare un diagramma "carino" che mostri la relazione tra queste tabelle. L'utilizzo di un'altra applicazione denominata SQL Designer (https://code.google.com/p/wwwsqldesigner/) mi fornirà l'immagine "carina", ma non so come creare lo schema XML richiesto.

Ho fatto una ricerca attraverso il forum (e MS) e non ho potuto trovare la mia risposta. Sono riuscito a trovare gli strumenti che hanno creato un database, ma sto guardando al contrario ... Ho bisogno di una bella immagine che mostra il database in forma schematica. Ho pensato che se potessi ottenere la mia struttura DB in XML, SQL Designer farà il resto per me.

Grazie per l'assistenza.

Nick

+0

Non è sufficiente lo strumento diagramma incorporato in SSMS? In ogni caso, è possibile interrogare i metadati (sys.tables, sys.indexes, sys.columns) e utilizzare FOR XML (AUTO) per ottenere una rappresentazione XML delle tabelle/chiavi/colonne necessarie. –

+0

È utile [questo] (http://stackoverflow.com/questions/473295/open-source-tool-to-generate-diagrams-from-xml-schema-documents)? –

+0

possibile duplicato di [Getting XML Schema da MS SQL Database] (http://stackoverflow.com/questions/298660/getting-xml-schema-from-ms-sql-database) –

risposta

13

Se avete solo bisogno lo schema XML di tabelle loro interrogare con questo:

select top 0 * FROM daTable FOR XML AUTO,XMLSCHEMA 

Se avete bisogno di nomi e colonne della tabella per creare una rappresentazione del tuo database e il modo in cui le tabelle sono connesse puoi usare qualcosa del genere:

SELECT 
s.name as '@Schema' 
,t.name as '@Name' 
,t.object_id as '@Id' 
,(
    SELECT c.name as '@Name' 
    ,c.column_id as '@Id' 
    ,IIF(ic.object_id IS NOT NULL,1,0) as '@IsPrimaryKey' 
    ,fkc.referenced_object_id as '@ColumnReferencesTableId' 
    ,fkc.referenced_column_id as '@ColumnReferencesTableColumnId' 
    FROM sys.columns as c 
    LEFT OUTER JOIN sys.index_columns as ic 
     ON c.object_id = ic.object_id 
     AND c.column_id = ic.column_id 
     AND ic.index_id = 1 
    LEFT OUTER JOIN sys.foreign_key_columns as fkc 
     ON c.object_id = fkc.parent_object_id 
     AND c.column_id = fkc.parent_column_id 
    WHERE c.object_id = t.object_id 
    FOR XML PATH ('Column'),TYPE 
) 
FROM sys.schemas as s 
INNER JOIN sys.tables as t 
    ON s.schema_id = t.schema_id 
FOR XML PATH('Table'),ROOT('Tables') 

Lascia che l'applicazione utilizzi ColumnReferencesTableId e ColumnReferencesTableColumnId per ottenere relazioni tra tabelle. Puoi anche unirti nuovamente alle colonne e alle tabelle a cui fai riferimento se preferisci scrivere i loro nomi ma ho pensato che i loro ID sarebbero stati sufficienti.

+0

Wow, grazie David. Darò questo e ti faccio sapere. Inoltre, grazie per i tuoi commenti precedenti. Credo che sia un duplicato basato sul link che hai fornito. Tuttavia, penso che il tuo riferimento qui sia più informativo. Cordiali saluti, Nick – Nickster

3

In combinazione con un cursore che attraversa INFORMATION_SCHEMA o sysobjects, il seguente dovrebbe aiutare:

SELECT * FROM [MyTable] FOR XML AUTO, XMLSCHEMA 

Sono incerto se si può semplicemente applicare questo a un intero database o quale sforzo di postelaborazione sarebbe necessario per combinare tutti i vari schemi di tabelle, ma è qualcosa su cui lavorare.

+0

grazie Zec per l'input. Lavorerò su alcune delle altre soluzioni prima di avventurarmi su questa strada. Apprezzo il tuo contributo. nick – Nickster

+0

Nessun problema.Altre risposte alla tua domanda, in particolare quelle di David, sono di gran lunga superiori. Sono sicuro che mi riferirò di nuovo qui in futuro. – Zec

1

Prova questo (una variante di questo answer):

DECLARE @listStr VARCHAR(MAX) 
SELECT @listStr = COALESCE(@listStr+',' ,'') + TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 

EXEC(' 
    DECLARE @schema xml 
    SET @schema = (SELECT TOP 0 * FROM ' + 
    @listStr + 
    ' FOR XML AUTO, ELEMENTS, XMLSCHEMA(''DbSchema'')) 
    SELECT @schema 
    '); 
+0

Grazie Alex. Oltre alla soluzione di David sopra, darò anche il tuo. Apprezzo molto il supporto di te e degli altri in questo forum. Cordiali saluti, Nick – Nickster

1

Sostituire la riga:

, IIF (ic.object_id non è nullo, 1,0) come '@IsPrimaryKey'

Con questo:

, CASO QUANDO ic.object_id NON È NULL POI 1 ALTRO 0 FINE COME '@IsPrimaryKey' per le versioni del server MS SQL che non consentono la funzione IIF.

+0

Potrebbe essere necessario formattare quel testo. –

Problemi correlati