113 Stimmen

Wie kann man programmatisch feststellen, welche SQL-Tabellen eine Identitätsspalte haben?

Ich möchte eine Liste von Spalten in SQL Server 2005 erstellen, die Identitätsspalten und ihre entsprechende Tabelle in T-SQL haben.

Die Ergebnisse würden etwa so aussehen:

Tabellenname, Spaltenname

1voto

Ardalan Shahgholi Punkte 10869

Verwenden Sie diese :

DECLARE @Table_Name VARCHAR(100) 
DECLARE @Column_Name VARCHAR(100)
SET @Table_Name = ''
SET @Column_Name = ''

SELECT  RowNumber = ROW_NUMBER() OVER ( PARTITION BY T.[Name] ORDER BY T.[Name], C.column_id ) ,
    SCHEMA_NAME(T.schema_id) AS SchemaName ,
    T.[Name] AS Table_Name ,
    C.[Name] AS Field_Name ,
    sysType.name ,
    C.max_length ,
    C.is_nullable ,
    C.is_identity ,
    C.scale ,
    C.precision
FROM    Sys.Tables AS T
    LEFT JOIN Sys.Columns AS C ON ( T.[Object_Id] = C.[Object_Id] )
    LEFT JOIN sys.types AS sysType ON ( C.user_type_id = sysType.user_type_id )
WHERE   ( Type = 'U' )
    AND ( C.Name LIKE '%' + @Column_Name + '%' )
    AND ( T.Name LIKE '%' + @Table_Name + '%' )
ORDER BY T.[Name] ,
    C.column_id

1voto

Nikolai Bielik Punkte 11

Dies funktionierte für SQL Server 2005, 2008 und 2012. Ich stellte fest, dass die sys.identity_columns nicht alle meine Tabellen mit Identitätsspalten enthielt.

SELECT a.name AS TableName, b.name AS IdentityColumn
FROM sys.sysobjects a 
JOIN sys.syscolumns b 
ON a.id = b.id
WHERE is_identity = 1
ORDER BY name;

Auf der Dokumentationsseite kann auch die Statusspalte verwendet werden. Sie können auch den vierteiligen Bezeichner hinzufügen, der auf verschiedenen Servern funktioniert.

SELECT a.name AS TableName, b.name AS IdentityColumn
FROM [YOUR_SERVER_NAME].[YOUR_DB_NAME].sys.sysobjects a 
JOIN [YOUR_SERVER_NAME].[YOUR_DB_NAME].sys.syscolumns b 
ON a.id = b.id
WHERE is_identity = 1
ORDER BY name;

Quelle: https://msdn.microsoft.com/en-us/library/ms186816.aspx

1voto

Jorge Santos Neill Punkte 1389

Aus irgendeinem Grund Sql-Server speichern einige Identität Spalten in verschiedenen Tabellen, der Code, der für mich arbeiten, ist die folgende:

select      TABLE_NAME tabla,COLUMN_NAME columna
from        INFORMATION_SCHEMA.COLUMNS
where       COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1
union all
select      o.name tabla, c.name columna
from        sys.objects o 
inner join  sys.columns c on o.object_id = c.object_id
where       c.is_identity = 1

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X