Wie kann ich die Tabellenstruktur in der SQL Server-Abfrage anzeigen?

72
SELECT DateTime, Skill, Name, TimeZone, ID, User, Employee, Leader 
FROM t_Agent_Skill_Group_Half_Hour AS t

Ich muss die Tabellenstruktur in einer Abfrage anzeigen.

Bassam Qarib
quelle
3
Was meinst du als Tabellenstruktur ? Ihre Frage ist IMO nicht klar.
Soner Gönül
3
Ich meine als Beispiel die Spaltenname Fähigkeit .... die Abfrage muss Fähigkeit zurückgeben .. DBINT: int
Bassam Qarib
3
Wir nennen das "Tabellenschema".
Namford
2
SQL Server ist das Schlimmste, was ich je gesehen habe
Akshay Hazari

Antworten:

135

Wenn Sie für SQL Server eine neuere Version verwenden, können Sie diese verwenden

select *
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='tableName'

Es gibt verschiedene Möglichkeiten, das Schema abzurufen. Mit ADO.NET können Sie die Schemamethoden verwenden . Verwenden Sie die MethodeDbConnection 's oder die Methode ' s .GetSchemaDataReaderGetSchemaTable

Vorausgesetzt, Sie haben einen Leser für die Abfrage, können Sie Folgendes tun:

using(DbCommand cmd = ...)
using(var reader = cmd.ExecuteReader())
{
    var schema = reader.GetSchemaTable();
    foreach(DataRow row in schema.Rows)
    {
        Debug.WriteLine(row["ColumnName"] + " - " + row["DataTypeName"])
    }
}

Weitere Informationen finden Sie in diesem Artikel .

PHeiberg
quelle
Ich brauche eine Abfrage zum Testen in Microsoft SQL Management Studio: s
Bassam Qarib
1
@BassamQarib - Warum markieren Sie die Frage C #, wenn Sie dies in Management Studio tun müssen?
PHeiberg
Entschuldigung, ich bin neuer Benutzer: ssss
Bassam Qarib
1
Ich habe auch eine SQL Server-Abfrage hinzugefügt
PHeiberg
Um auf eine in einer bestimmten Datenbank definierte Tabelle zugreifen zu können, müssen Sie möglicherweise zu Beginn "<Datenbankname> verwenden" verwenden, insbesondere wenn Sie ohne Angabe der verbundenen Datenbank ausführen.
Yu Shen
45

sp_help tablename in SQL Server

desc tablename im Orakel

Vinoth_S
quelle
Was genau ist der Unterschied zwischen "sp_help tablename" und '' 'select * aus INFORMATION_SCHEMA.COLUMNS, wobei TABLE_NAME =' tableName '' ''
Archan Joshi
@ArchanJoshi: Probieren Sie es aus, führen Sie das eine und das andere aus und Sie werden sehen. "sp_help" gibt Ihnen Informationen über PKs, Einschränkungen, während die andere mehr Informationen über die Spalten selbst bietet
Damián Pablo González
Syntax für eine Tabelle in einem anderen Schema sp_help 'schema.tabellenname' zB sp_help 'geo.test'
JohnC
15

Versuchen Sie diese Abfrage:

DECLARE @table_name SYSNAME
SELECT @table_name = 'dbo.test_table'

DECLARE 
      @object_name SYSNAME
    , @object_id INT

SELECT 
      @object_name = '[' + s.name + '].[' + o.name + ']'
    , @object_id = o.[object_id]
FROM sys.objects o WITH (NOWAIT)
JOIN sys.schemas s WITH (NOWAIT) ON o.[schema_id] = s.[schema_id]
WHERE s.name + '.' + o.name = @table_name
    AND o.[type] = 'U'
    AND o.is_ms_shipped = 0

DECLARE @SQL NVARCHAR(MAX) = ''

;WITH index_column AS 
(
    SELECT 
          ic.[object_id]
        , ic.index_id
        , ic.is_descending_key
        , ic.is_included_column
        , c.name
    FROM sys.index_columns ic WITH (NOWAIT)
    JOIN sys.columns c WITH (NOWAIT) ON ic.[object_id] = c.[object_id] AND ic.column_id = c.column_id
    WHERE ic.[object_id] = @object_id
)
SELECT @SQL = 'CREATE TABLE ' + @object_name + CHAR(13) + '(' + CHAR(13) + STUFF((
    SELECT CHAR(9) + ', [' + c.name + '] ' + 
        CASE WHEN c.is_computed = 1
            THEN 'AS ' + cc.[definition] 
            ELSE UPPER(tp.name) + 
                CASE WHEN tp.name IN ('varchar', 'char', 'varbinary', 'binary', 'text')
                       THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length AS VARCHAR(5)) END + ')'
                     WHEN tp.name IN ('nvarchar', 'nchar', 'ntext')
                       THEN '(' + CASE WHEN c.max_length = -1 THEN 'MAX' ELSE CAST(c.max_length / 2 AS VARCHAR(5)) END + ')'
                     WHEN tp.name IN ('datetime2', 'time2', 'datetimeoffset') 
                       THEN '(' + CAST(c.scale AS VARCHAR(5)) + ')'
                     WHEN tp.name = 'decimal' 
                       THEN '(' + CAST(c.[precision] AS VARCHAR(5)) + ',' + CAST(c.scale AS VARCHAR(5)) + ')'
                    ELSE ''
                END +
                CASE WHEN c.collation_name IS NOT NULL THEN ' COLLATE ' + c.collation_name ELSE '' END +
                CASE WHEN c.is_nullable = 1 THEN ' NULL' ELSE ' NOT NULL' END +
                CASE WHEN dc.[definition] IS NOT NULL THEN ' DEFAULT' + dc.[definition] ELSE '' END + 
                CASE WHEN ic.is_identity = 1 THEN ' IDENTITY(' + CAST(ISNULL(ic.seed_value, '0') AS CHAR(1)) + ',' + CAST(ISNULL(ic.increment_value, '1') AS CHAR(1)) + ')' ELSE '' END 
        END + CHAR(13)
    FROM sys.columns c WITH (NOWAIT)
    JOIN sys.types tp WITH (NOWAIT) ON c.user_type_id = tp.user_type_id
    LEFT JOIN sys.computed_columns cc WITH (NOWAIT) ON c.[object_id] = cc.[object_id] AND c.column_id = cc.column_id
    LEFT JOIN sys.default_constraints dc WITH (NOWAIT) ON c.default_object_id != 0 AND c.[object_id] = dc.parent_object_id AND c.column_id = dc.parent_column_id
    LEFT JOIN sys.identity_columns ic WITH (NOWAIT) ON c.is_identity = 1 AND c.[object_id] = ic.[object_id] AND c.column_id = ic.column_id
    WHERE c.[object_id] = @object_id
    ORDER BY c.column_id
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, CHAR(9) + ' ')
    + ISNULL((SELECT CHAR(9) + ', CONSTRAINT [' + k.name + '] PRIMARY KEY (' + 
                    (SELECT STUFF((
                         SELECT ', [' + c.name + '] ' + CASE WHEN ic.is_descending_key = 1 THEN 'DESC' ELSE 'ASC' END
                         FROM sys.index_columns ic WITH (NOWAIT)
                         JOIN sys.columns c WITH (NOWAIT) ON c.[object_id] = ic.[object_id] AND c.column_id = ic.column_id
                         WHERE ic.is_included_column = 0
                             AND ic.[object_id] = k.parent_object_id 
                             AND ic.index_id = k.unique_index_id     
                         FOR XML PATH(N''), TYPE).value('.', 'NVARCHAR(MAX)'), 1, 2, ''))
            + ')' + CHAR(13)
            FROM sys.key_constraints k WITH (NOWAIT)
            WHERE k.parent_object_id = @object_id 
                AND k.[type] = 'PK'), '') + ')'  + CHAR(13)

PRINT @SQL

Ausgabe:

CREATE TABLE [dbo].[test_table]
(
      [WorkOutID] BIGINT NOT NULL IDENTITY(1,1)
    , [DateOut] DATETIME NOT NULL
    , [EmployeeID] INT NOT NULL
    , [IsMainWorkPlace] BIT NOT NULL DEFAULT((1))
    , [WorkPlaceUID] UNIQUEIDENTIFIER NULL
    , [WorkShiftCD] NVARCHAR(10) COLLATE Cyrillic_General_CI_AS NULL
    , [CategoryID] INT NULL
    , CONSTRAINT [PK_WorkOut] PRIMARY KEY ([WorkOutID] ASC)
)

Lesen Sie auch dies:

http://www.c-sharpcorner.com/UploadFile/67b45a/how-to-generate-a-create-table-script-for-an-existing-table/

Devart
quelle
2
Wählen Sie in der SSMS-Rechtsklick-Tabelle Skripttabelle als> Erstellen an> Neues Abfrage-Editor-Fenster .
Rubio
Warum eine so einfache Aufgabe so kompliziert machen?
Vladimir Nul
Hat bei mir nicht funktioniert. Ich habe kein SQL Server Management Studio. Ich habe nur den Azure Sql Query Editor.
user1229458
14

Unter SQL Server 2012 können Sie die folgende gespeicherte Prozedur verwenden:

sp_columns '<table name>'

Beispiel: Eine Datenbanktabelle mit dem Namen users:

sp_columns 'users'
Jesuisme
quelle
3

Für neuere Versionen von SQL Server Management Studio Schreiben Sie das in einen Abfrageeditor und führen Sie "Alt" + "F1" aus.

Koji D'infinte
quelle
2

Ein anderer Weg ist,

mysql > SHOW CREATE TABLE my_db.my_table;

Sie sollten den Tabellennamen erhalten und die Tabellen-SQL erstellen

Shudipta Sharma
quelle
1

Ich habe 'DESC table_name' versucht, aber dann funktionierte dies für mich in psql:

select * 
from INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME='table_name'; 
valkyrie55
quelle
0

Um ein Schema zu drucken, verwende ich Jade und exportiere es in eine Datei der Datenbank. Dann bringe ich es in Word, um es zu formatieren und zu drucken

Steve
quelle
1
Bitte erläutern Sie Ihre Antwort.
jpp
0

In SQL Server können Sie diese Abfrage verwenden:

USE Database_name

SELECT *
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME='Table_Name';

Und vergessen Sie nicht zu ersetzen Database_nameund Table_namemit den genauen Namen Ihrer Datenbank- und Tabellennamen.

Hanan Fadel
quelle