2008-09-17 15 views

Odpowiedz

141

Innym potencjalnym sposobem, aby to zrobić dla SQL Server, który ma mniejszą zależność od tabel systemowych (które mogą ulec zmianie w wersji do wersji) jest użycie poglądy INFORMATION_SCHEMA:

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

zanotuj, że można podać [nazwa db] .information_schema.columns, ale uruchom z innego db ... a następnie COLUMNPROPERTY działa przeciwko niewłaściwemu db –

+11

To jest lepsze w ten sposób, gdy masz inne schematy: gdzie COLUMNPROPERTY (object_id (TABLE_SCHEMA + '.' + TABLE_NAME) ... –

+1

Myślę, że ta odpowiedź nie działa z programem Microsoft SQL Server 2014. – ChrisW

43

sys.columns.is_identity = 1

np

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

To dokładnie to, czego szukałem. dzięki! –

+2

Uwaga: działa to dla mnie w SQL 2008, podczas gdy akceptowana odpowiedź nie (pytanie dotyczy SQL 2005). –

+1

Ta odpowiedź działa również z programem Microsoft SQL Server 2014. – ChrisW

4

W SQL 2005:

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

myślę, że to działa na SQL 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

Nie wiem, co robi autoval, ale jest to NULL dla wszystkich pól tożsamości. Kod SQL 2000, który mam działa to gdzie colstat i 1 = 1 Nie jestem pewien skąd ten kod pochodzi (ma około 5 lat), ale mój komentarz mówi, że maska ​​bitowa jest konieczna. Ale colstat = 1 dla moich tożsamości. –

+0

hmm ... użyłem stanu i 128 = 128, aby określić moje tożsamości :-P – Brimstedt

2

To zapytanie wydaje rade:

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

inny sposób (2000/2005/2012/2014):

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

UWAGA: table_name_here powinna być schema.table, chyba że schematem jest dbo.

+4

najlepszy i najkrótszy sposób. Dziękuję Ci! (działa z sql 2012) – SeriousM

1

oto wersja dla MSSQL 2000. pracę mam zmodyfikowany kod z 2005 znaleźć tutaj: 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

ten pracował dla mnie za pomocą SQL Server 2008:

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

Użyj tego:

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

Wykaz tabel bez kolumny tożsamości opartej na Guillermo odpowiedź:

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

Ten pracował dla SQL Server 2005, 2008 i 2012. okazało się, że sys.identity_columns nie zawiera wszystkich moich tabel z kolumnami tożsamości.

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; 

Patrząc na stronę dokumentacji, można również wykorzystać kolumnę statusu. Możesz również dodać identyfikator czterech części i będzie działać na różnych serwerach.

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; 

Źródło: https://msdn.microsoft.com/en-us/library/ms186816.aspx