مقایسه sys.tables، sys.columns، sys.system_columns و sys.all_columns در SQL Server: راهنمای جامع متا دیتا
در SQL Server، نماهای سیستمی (System Views) اطلاعات فراوانی درباره پایگاه داده و اشیاء آن ارائه میدهند. چهار نمای سیستمی کلیدی شامل sys.tables
، sys.columns
، sys.system_columns
و sys.all_columns
اغلب برای کوئرینویسی و استخراج فراداده (Metadata) استفاده میشوند. درک دقیق تفاوتهای این نماها برای توسعهدهندگان و مدیران دیتابیس در مدیریت و بهینهسازی SQL Server بسیار مهم است و به کارایی و دقت در عملیات دیتابیس کمک شایانی میکند.
sys.tables
نمای sys.tables
لیست تمام جداول تعریف شده توسط کاربر و جداول سیستمی را که به عنوان جداول پایه (base tables) شناخته میشوند، ارائه میدهد. این نما اطلاعاتی نظیر نام جدول، شناسه شیء (object_id) و سایر ویژگیهای مرتبط با خود جدول را در بر میگیرد، اما جزئیات مربوط به ستونها را مستقیماً نشان نمیدهد. استفاده از sys.tables
برای مشاهده سریع ساختار کلی جداول در یک پایگاه داده یا شناسایی جداول خاص مفید است و یک نقطه شروع عالی برای کاوش در ساختار دیتابیس محسوب میشود.
SELECT
t.name AS TableName,
t.object_id AS TableId,
t.create_date AS CreateDate,
t.modify_date AS ModifyDate
FROM
sys.tables AS t
ORDER BY
TableName;
sys.columns
sys.columns
نمایی حیاتی است که اطلاعات دقیق ستونها را برای تمام جداول و نماهای تعریف شده توسط کاربر (user-defined tables and views) فراهم میکند. این نما جزئیاتی مانند نام ستون، نوع داده، قابلیت Null بودن (nullability)، طول و ترتیب ستونها را شامل میشود. sys.columns
برای بررسی ساختار ستونهای یک جدول خاص، شناسایی انواع دادهها یا پیدا کردن ستونهایی با ویژگیهای مشخص بسیار کاربردی است و به عنوان یک ابزار قدرتمند برای تجزیه و تحلیل ساختار دیتابیس و اعتبارسنجی طرحواره (schema validation) عمل میکند.
SELECT
c.name AS ColumnName,
t.name AS DataType,
c.max_length AS MaxLength,
c.precision AS Precision,
c.scale AS Scale,
c.is_nullable AS IsNullable
FROM
sys.columns AS c
INNER JOIN
sys.types AS t ON c.system_type_id = t.system_type_id
WHERE
c.object_id = OBJECT_ID('YourTableName') -- Replace 'YourTableName' with an actual table name
ORDER BY
c.column_id;
sys.system_columns
sys.system_columns
عمدتاً برای دسترسی به اطلاعات ستونهای موجود در جداول سیستمی (system tables) به کار میرود. این نما، مشابه sys.columns
، جزئیات ستونها را ارائه میدهد اما تمرکز آن بر روی اشیاء سیستمی داخلی SQL Server است. این ویو برای تجزیه و تحلیل عمیق ساختار داخلی SQL Server و درک چگونگی ذخیرهسازی فراداده توسط سیستم بسیار مفید است، هرچند که کمتر مورد استفاده مستقیم توسعهدهندگان عمومی قرار میگیرد و بیشتر برای متخصصین پایگاه داده که نیاز به دسترسی به فرادادههای سطح پایین دارند، کاربرد دارد.
SELECT
sc.name AS SystemColumnName,
st.name AS DataType,
sc.max_length AS MaxLength,
sc.is_nullable AS IsNullable
FROM
sys.system_columns AS sc
INNER JOIN
sys.types AS st ON sc.system_type_id = st.system_type_id
WHERE
sc.object_id = OBJECT_ID('sys.objects') -- Example: Query columns of sys.objects system table
ORDER BY
sc.column_id;
sys.all_columns
sys.all_columns
یک نمای جامع است که اطلاعات ستونها را برای هر دو نوع اشیاء، یعنی جداول و نماهای تعریف شده توسط کاربر و همچنین جداول و نماهای سیستمی، در یک جا ترکیب میکند. این نما معادل ترکیب نتایج sys.columns
و sys.system_columns
است و یک دید یکپارچه از تمام ستونهای موجود در پایگاه داده ارائه میدهد. استفاده از sys.all_columns
میتواند فرآیند کوئرینویسی برای فراداده را سادهتر کند، به خصوص زمانی که نیاز به بررسی ستونها بدون تمایز بین اشیاء کاربر و سیستم باشد. این ویو، با ارائه یک دید کلی از تمام ستونهای موجود در پایگاه داده، یک ابزار قدرتمند برای تحلیل و گزارشگیری فراداده به شمار میرود و برای کاوشهای گسترده در ساختار دیتابیس بسیار کارآمد است.
SELECT
ac.name AS ColumnName,
OBJECT_NAME(ac.object_id) AS ObjectName,
t.name AS DataType,
ac.is_nullable AS IsNullable
FROM
sys.all_columns AS ac
INNER JOIN
sys.types AS t ON ac.system_type_id = t.system_type_id
WHERE
OBJECT_NAME(ac.object_id) IN ('YourTableName', 'sys.objects') -- Example: Query columns for a user table and a system table
ORDER BY
ObjectName, ac.column_id;