আমি এসকিউএল সার্ভার 2005-এ কলামগুলির একটি তালিকা তৈরি করতে চাই যাতে পরিচয় কলাম এবং টি-এসকিউএলে তাদের সম্পর্কিত সারণী রয়েছে।
ফলাফলগুলি এমন কিছু হবে:
টেবিল নাম, কলাম নাম
উত্তর:
এসকিউএল সার্ভারের জন্য এটি করার আরেকটি সম্ভাব্য উপায়, যা সিস্টেম টেবিলগুলির উপর কম নির্ভরতা রাখে (যা পরিবর্তনের সাপেক্ষে, সংস্করণে সংস্করণ হয়) 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
INFORMATION_SCHEMA.COLUMNS
সরল সারণী এবং দর্শনগুলির জন্য ইনফস রয়েছে এবং আমি ফলাফল সেটটির পাঠযোগ্যতার জন্য TABLE_TYPE (INFORMATION_SCHEMA.TABLES এ যোগ দেওয়ার) যোগ করার পরামর্শ দিচ্ছি।
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
এসকিউএল 2005 এ:
select object_name(object_id), name
from sys.columns
where is_identity = 1
এই ক্যোয়ারীটি কৌশলটি মনে হচ্ছে:
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')
এখানে এমএস স্কুয়েল 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;
নিম্নলিখিত ক্যোয়ারী আমার জন্য কাজ করে:
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
আমি মনে করি এটি এসকিউএল 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
এটি আমার জন্য এসকিএল সার্ভার ২০০৮ ব্যবহার করে:
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
এটা ব্যবহার কর :
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
এটি এসকিউএল সার্ভার ২০০,, ২০০৮ এবং ২০১২-এর জন্য কাজ করেছে 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
কোনও কারণে এসকিএল সার্ভারটি বিভিন্ন টেবিলে কিছু পরিচয় কলামগুলি সংরক্ষণ করে, আমার পক্ষে কাজ করা কোডটি নিম্নলিখিত:
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