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.


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 .


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


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/


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'

3

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


2

Ein anderer Weg ist,

mysql > SHOW CREATE TABLE my_db.my_table;

Sie sollten den Tabellennamen erhalten und die Tabellen-SQL erstellen


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'; 

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


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.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.