2017-01-09 1 views
0

Ich versuche, eine SQL-Abfrage zu schreiben, um die vollständige Spezifikation des Primärschlüssels einer Tabelle zu erhalten. Ich kann eine Abfrage schreiben, um die Spalten einzubeziehen, aber ich kann die Sortierinformationen der Spalten nicht abfragen. Zum Beispiel definiert die Tabelle als:Sql Server - Holen Sie sich den vollständigen Primärschlüssel der Tabelle einschließlich Spaltensortierung über eine SQL-Abfrage

CREATE TABLE [dbo].[MyPrimaryKeyTable]([MyKeyColumn] [int] NOT NULL, [SecondKeyColumn] [int] NOT NULL, [ThirdCol] [varchar](50) NOT NULL, [ForthCol] [varchar](10) NOT NULL) 
GO 

ALTER TABLE [dbo].[MyPrimaryKeyTable] ADD CONSTRAINT [PK_MyPrimaryKey] PRIMARY KEY CLUSTERED ([MyKeyColumn] ASC, [SecondKeyColumn] DESC, [ThirdCol] DESC) 
GO 

Wenn Sie die Abfrage verwenden:

SELECT * 
FROM INFORMATION_SCHEMA.KEY_COLUMN_USAGE 
WHERE TABLE_NAME = 'MyPrimaryKeyTable' 

Dann bekomme ich wieder eine Reihe von Ergebnissen, die den Tabellennamen und die drei Spalten, die den Primärschlüssel bilden (MyKeyColumn, SecondKeyColumn und ThirdCol) aber es gibt keine Information um zu sagen, dass die MyKeyColumn aufsteigend sortiert wurde und die anderen beiden Spalten absteigend als Teil des Schlüssels sortiert wurden. Wie frage ich die Spaltensortierungsinformationen für den Primärschlüssel ab?

Antwort

1

So etwas - Sie können OBJECT_NAME (o.parent_object_id) = 'Tabellenname' in die Wo für eine einzelne PK hinzufügen. Mit ein wenig Optimierung kann es Ihnen auch die Daten für alle Indizes geben.

SELECT OBJECT_SCHEMA_NAME(o.parent_object_id) AS [Schema], OBJECT_NAME(o.parent_object_id) AS [Table], o.name AS PrimaryKey, ic.index_id, ic.key_ordinal, c.name AS ColumnName, t.name AS DataType, ic.is_descending_key 
from sys.objects o 
inner join sys.indexes i on i.object_id = o.parent_object_id and i.is_primary_key = 1 
inner join sys.index_columns ic on ic.object_id = i.object_id and ic.index_id = i.index_id 
inner join sys.columns c on c.object_id = o.parent_object_id and c.column_id = ic.column_id 
inner join sys.types t ON t.user_type_id = c.user_type_id 
where o.type = 'PK' 
ORDER BY OBJECT_SCHEMA_NAME(o.parent_object_id), OBJECT_NAME(o.parent_object_id), ic.key_ordinal 

Auf einer allgemeineren Anmerkung, die mit MS DMV im Allgemeinen mehr Informationen als die INFORMATION_SCHEMA Ansichten offenbaren wird, z.B. Benutzerdatentypen & andere SQL Server-spezifische Features.

+0

danke das ist genau das, was ich gesucht habe –

+0

@KevinHolditch kein Problem Kumpel –

Verwandte Themen