2008-09-17 16 views

Antwort

141

Eine andere mögliche Weg, dies für SQL Server, die auf den Systemtabellen weniger Vertrauen zu tun hat (die sich ändern können, Version zu Version) ist die INFORMATION_SCHEMA Ansichten zu verwenden:

select COLUMN_NAME, TABLE_NAME 
from INFORMATION_SCHEMA.COLUMNS 
where COLUMNPROPERTY(object_id(TABLE_SCHEMA+'.'+TABLE_NAME), COLUMN_NAME, 'IsIdentity') = 1 
order by TABLE_NAME 
+0

Beachten Sie, dass Sie [DB-Name] .information_schema.columns angeben können, aber von einer anderen Datenbank ausführen ... und dann COLUMNPROPERTY wird gegen die falsche db ausgeführt –

+11

Es ist besser so, wenn Sie haben andere Schemata: wo COLUMNPROPERTY (object_id (TABLE_SCHEMA + '.' + TABLE_NAME) ... –

+1

Ich denke, diese Antwort funktioniert nicht mit Microsoft SQL Server 2014. – ChrisW

43

sys.columns.is_identity = 1

zB

select o.name, c.name 
from sys.objects o inner join sys.columns c on o.object_id = c.object_id 
where c.is_identity = 1 
+0

Das ist genau das, was ich suchte. Vielen Dank! –

+2

Hinweis: Dies funktioniert für mich in SQL 2008, während die angenommene Antwort nicht (die Frage fragt für SQL 2005). –

+1

Diese Antwort funktioniert auch mit Microsoft SQL Server 2014. – ChrisW

4

In SQL 2005:

select object_name(object_id), name 
from sys.columns 
where is_identity = 1 

Ergebnisse würden so etwas wie

0

Ich denke, das für SQL arbeitet 2000:

SELECT 
    CASE WHEN C.autoval IS NOT NULL THEN 
     'Identity' 
    ELSE 
     'Not Identity' 
    AND 
FROM 
    sysobjects O 
INNER JOIN 
    syscolumns C 
ON 
    O.id = C.id 
WHERE 
    O.NAME = @TableName 
AND 
    C.NAME = @ColumnName 
+0

Ich weiß nicht, was Autoval tut, aber es ist NULL für alle meine Identitätsfelder. Der SQL 2000-Code, den ich habe, ist wo Colstat & 1 = 1 Ich bin nicht sicher, woher dieser Code kam (es ist etwa 5 Jahre alt), aber mein Kommentar sagt, dass eine Bitmaske erforderlich ist. Aber colstat = 1 für meine Identitäten. –

+0

hmm ... ich habe den Status & 128 = 128 benutzt, um meine Identitäten zu bestimmen :-P – Brimstedt

2

Diese Abfrage scheint den Trick zu tun:

SELECT 
    sys.objects.name AS table_name, 
    sys.columns.name AS column_name 
FROM sys.columns JOIN sys.objects 
    ON sys.columns.object_id=sys.objects.object_id 
WHERE 
    sys.columns.is_identity=1 
    AND 
    sys.objects.type in (N'U') 
23

andere Art und Weise (für 2000/2005/2012/2014):

IF ((SELECT OBJECTPROPERTY(OBJECT_ID(N'table_name_here'), 'TableHasIdentity')) = 1) 
    PRINT 'Yes' 
ELSE 
    PRINT 'No' 

HINWEIS: table_name_here sollte schema.table sein, es sei denn, das Schema ist dbo.

+4

besten und kürzesten Weg. Danke! (Arbeitet mit SQL 2012) – SeriousM

1

hier ein ist Arbeitsversion für MSSQL 2000. ich habe geändert fanden die 2005 Code hier: http://sqlfool.com/2011/01/identity-columns-are-you-nearing-the-limits/

/* Define how close we are to the value limit 
    before we start throwing up the red flag. 
    The higher the value, the closer to the limit. */ 
DECLARE @threshold DECIMAL(3,2); 
SET @threshold = .85; 

/* Create a temp table */ 
CREATE TABLE #identityStatus 
(
     database_name  VARCHAR(128) 
    , table_name  VARCHAR(128) 
    , column_name  VARCHAR(128) 
    , data_type   VARCHAR(128) 
    , last_value  BIGINT 
    , max_value   BIGINT 
); 

DECLARE @dbname sysname; 
DECLARE @sql nvarchar(4000); 

-- Use an cursor to iterate through the databases since in 2000 there's no sp_MSForEachDB command... 

DECLARE c cursor FAST_FORWARD FOR 
SELECT 
    name 
FROM 
    master.dbo.sysdatabases 
WHERE 
    name NOT IN('master', 'model', 'msdb', 'tempdb'); 

OPEN c; 

FETCH NEXT FROM c INTO @dbname; 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    SET @sql = N'Use [' + @dbname + ']; 
    Insert Into #identityStatus 
    Select ''' + @dbname + ''' As [database_name] 
     , Object_Name(id.id) As [table_name] 
     , id.name As [column_name] 
     , t.name As [data_type] 
     , IDENT_CURRENT(Object_Name(id.id)) As [last_value] 
     , Case 
      When t.name = ''tinyint'' Then 255 
      When t.name = ''smallint'' Then 32767 
      When t.name = ''int''  Then 2147483647 
      When t.name = ''bigint'' Then 9223372036854775807 
      End As [max_value] 
    From 
     syscolumns As id 
     Join systypes As t On id.xtype = t.xtype 
    Where 
     id.colstat&1 = 1 -- this identifies the identity columns (as far as I know) 
    '; 

    EXECUTE sp_executesql @sql; 

    FETCH NEXT FROM c INTO @dbname; 
END 

CLOSE c; 
DEALLOCATE c; 

/* Retrieve our results and format it all prettily */ 
SELECT database_name 
    , table_name 
    , column_name 
    , data_type 
    , last_value 
    , CASE 
     WHEN last_value < 0 THEN 100 
     ELSE (1 - CAST(last_value AS FLOAT(4))/max_value) * 100 
     END AS [percentLeft] 
    , CASE 
     WHEN CAST(last_value AS FLOAT(4))/max_value >= @threshold 
      THEN 'warning: approaching max limit' 
     ELSE 'okay' 
     END AS [id_status] 
FROM #identityStatus 
ORDER BY percentLeft; 

/* Clean up after ourselves */ 
DROP TABLE #identityStatus; 
0

das ist für mich gearbeitet SQL Server 2008 verwenden:

USE <database_name>; 
GO 
SELECT SCHEMA_NAME(schema_id) AS schema_name 
    , t.name AS table_name 
    , c.name AS column_name 
FROM sys.tables AS t 
JOIN sys.identity_columns c ON t.object_id = c.object_id 
ORDER BY schema_name, table_name; 
GO 
0

verwenden:

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 
1

Liste der Tabellen ohne Spalte Identität basierend auf Guillermo Antwort:

SELECT DISTINCT TABLE_NAME 
FROM   INFORMATION_SCHEMA.COLUMNS 
WHERE  (TABLE_SCHEMA = 'dbo') AND (OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 0) 
ORDER BY TABLE_NAME 
0

Diese für SQL Server arbeitete 2005, 2008 und 2012. Ich fand, dass die sys.identity_columns enthielt nicht alle meine Tabellen mit Identitätsspalten.

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; 

Mit Blick auf die Dokumentationsseite kann auch die Statusspalte verwendet werden. Sie können auch die vierteilige Kennung hinzufügen und sie wird auf verschiedenen Servern funktionieren.

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