কীভাবে আপনি নির্ধারণ করবেন যে এসকিউএল টেবিলগুলির একটি পরিচয় কলাম প্রোগ্রামগতভাবে রয়েছে


103

আমি এসকিউএল সার্ভার 2005-এ কলামগুলির একটি তালিকা তৈরি করতে চাই যাতে পরিচয় কলাম এবং টি-এসকিউএলে তাদের সম্পর্কিত সারণী রয়েছে।

ফলাফলগুলি এমন কিছু হবে:

টেবিল নাম, কলাম নাম

উত্তর:


174

এসকিউএল সার্ভারের জন্য এটি করার আরেকটি সম্ভাব্য উপায়, যা সিস্টেম টেবিলগুলির উপর কম নির্ভরতা রাখে (যা পরিবর্তনের সাপেক্ষে, সংস্করণে সংস্করণ হয়) 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 

একটি গ্যাচা নোট করুন যে আপনি [db নাম] .information_schema.collines নির্দিষ্ট করতে পারেন, তবে অন্য ডিবি থেকে চালান ... এবং তারপরে COLUMNPROPERYY ভুল db এর বিরুদ্ধে চলছে
মাইক এম

12
'।' যেখানে COLUMNPROPERTY (object_id (TABLE_SCHEMA + TABLE_NAME) ...: এটা আপনি অন্যান্য স্কিমের আছে ভালো উপায়
হোসেইন Margani

4
আমি মনে করি এই উত্তরটি মাইক্রোসফ্ট এসকিউএল সার্ভার ২০১৪
ক্রিসডাব্লু

আপনি যদি এমন কোনও সহজ পদ্ধতির সন্ধান করছেন যা এসকিউএল সার্ভার 2000 থেকে কাজ করে তবে এর আগে @ গুইলার্মো এই উত্তরটি দেখুন ।
লঙ্ক্যমার্ট

INFORMATION_SCHEMA.COLUMNSসরল সারণী এবং দর্শনগুলির জন্য ইনফস রয়েছে এবং আমি ফলাফল সেটটির পাঠযোগ্যতার জন্য TABLE_TYPE (INFORMATION_SCHEMA.TABLES এ যোগ দেওয়ার) যোগ করার পরামর্শ দিচ্ছি।
ডিয়েগো স্কারাভ্যাগি

51

sys.columns.is_identity = 1

যেমন,

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

4
দ্রষ্টব্য: এটি এসকিউএল ২০০৮ এ আমার জন্য কাজ করে, যেখানে স্বীকৃত উত্তর দেয় না (প্রশ্নটি এসকিউএল 2005 এর জন্য জিজ্ঞাসা করে)।
ড্যানিয়েল শেফার

4
এই উত্তরটি মাইক্রোসফ্ট এসকিউএল সার্ভার ২০১৪
তেও

27

আরেকটি উপায় (2000/2005/2012/2014 এর জন্য):

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

দ্রষ্টব্য: স্কিমা না থাকলে table_name_hereহওয়া উচিত ।schema.tabledbo



3

এই ক্যোয়ারীটি কৌশলটি মনে হচ্ছে:

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

2

এখানে এমএস স্কুয়েল 2000. একটি কাজ সংস্করণ আমি 2005 কোড এখানে পাওয়া পরিবর্তিত করেছি: 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;

2

গিলারমো উত্তরের ভিত্তিতে সনাক্তকরণ কলাম ছাড়াই সারণীর তালিকা :

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

2

নিম্নলিখিত ক্যোয়ারী আমার জন্য কাজ করে:

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

1

আমি মনে করি এটি এসকিউএল 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

আমি জানি না অটোওয়াল কী করে, তবে এটি আমার সমস্ত পরিচয় ক্ষেত্রের জন্য শুভ। আমার যে এসকিউএল 2000 কোডটি কাজ করে তা হ'ল কোলস্ট্যাট & 1 = 1 আমি নিশ্চিত নই যে এই কোডটি কোথা থেকে এসেছে (এটি প্রায় 5 বছরের পুরানো) তবে আমার মন্তব্য বলে যে বিটমাস্কটি প্রয়োজনীয়। তবে আমার পরিচয়ের জন্য কলস্ট্যাট = 1।
কেভিন ক্রামলে

হুম ... আমি আমার পরিচয়গুলি নির্ধারণ করতে স্থিতি & 128 = 128 ব্যবহার করেছি :
পি

1

এটি আমার জন্য এসকিএল সার্ভার ২০০৮ ব্যবহার করে:

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

1

এটা ব্যবহার কর :

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

এটি এসকিউএল সার্ভার ২০০,, ২০০৮ এবং ২০১২-এর জন্য কাজ করেছে I

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;

ডকুমেন্টেশন পৃষ্ঠাটি দেখে স্থিতি কলামটিও ব্যবহার করা যেতে পারে। এছাড়াও আপনি চারটি অংশ সনাক্তকারী যুক্ত করতে পারেন এবং এটি বিভিন্ন সার্ভার জুড়ে কাজ করবে।

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;

সূত্র: https://msdn.microsoft.com/en-us/library/ms186816.aspx


1

কোনও কারণে এসকিএল সার্ভারটি বিভিন্ন টেবিলে কিছু পরিচয় কলামগুলি সংরক্ষণ করে, আমার পক্ষে কাজ করা কোডটি নিম্নলিখিত:

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.