COLUMNPROPERTY در SQL Server؛ آموزش کامل و مثال عملی

آموزش تابع COLUMNPROPERTY در SQL Server؛ مثال‌ها و نکات حرفه‌ای

توسط admin | گروه SQL Server | 1405/04/29

نظرات 0

آموزش جامع تابع COLUMNPROPERTY در SQL Server؛ از Syntax تا بهینه‌سازی

مقدمه و جایگاه تابع در SQL Server

تابع COLUMNPROPERTY یکی از ابزارهای مهم متادیتا در Microsoft SQL Server است و برای خواندن یک ویژگی مشخص از ستون یا پارامتر با خروجی عددی استفاده می‌شود. متادیتا داده‌ای درباره ساختار و وضعیت داده‌هاست؛ بنابراین پاسخ این تابع به محتوای رکوردهای تجاری وابسته نیست، بلکه به Context پایگاه داده، کاتالوگ سیستم، نوع ورودی و سطح دسترسی کاربر ارتباط دارد.

در پروژه‌های واقعی، COLUMNPROPERTY در اعتبارسنجی Schema، کشف ستون‌های Identity و Computed، تولید INSERT پویا، ساخت Data Dictionary و کنترل قابلیت Null به کار می‌رود. استفاده حرفه‌ای فقط نوشتن یک SELECT کوتاه نیست؛ باید تفاوت مقدار معتبر، صفر و NULL، اثر Metadata Visibility، نام‌گذاری Schema-qualified و هزینه اجرای تکراری تابع را نیز شناخت.

این راهنما از مثال پایه آغاز می‌کند و تا سناریوهای ممیزی، گزارش‌گیری و بهینه‌سازی پیش می‌رود. برای مشاهده نقشه کامل این خانواده، راهنمای جامع توابع متادیتا در SQL Server را نیز مطالعه کنید.

تعریف، Syntax و قرارداد خروجی COLUMNPROPERTY

COLUMNPROPERTY به زبان ساده خواندن یک ویژگی مشخص از ستون یا پارامتر با خروجی عددی را انجام می‌دهد. موتور SQL Server ورودی را در Context جاری تفسیر می‌کند و نتیجه‌ای با نوع int برمی‌گرداند. اگر ورودی به شیء معتبر اشاره نکند، property پشتیبانی نشود یا کاربر اجازه دیدن متادیتا را نداشته باشد، نتیجه می‌تواند NULL باشد.

نحو استاندارد

SELECT COLUMNPROPERTY ( id , column , property ) AS Result;
    

پارامترها

id شناسه جدول یا رویه، column نام ستون یا پارامتر و property نام ویژگی پشتیبانی‌شده مانند IsIdentity، IsComputed، AllowsNull یا ColumnId است.

نوع خروجی و معنای NULL

نوع اعلام‌شده خروجی int است. برنامه مصرف‌کننده باید NULL را یک حالت مستقل بداند و پیش از تبدیل نوع یا تصمیم‌گیری، علت آن را بررسی کند. معنای صفر، یک و NULL به property وابسته است؛ نام property نامعتبر، شیء نامعتبر یا نبود مجوز معمولاً NULL ایجاد می‌کند.

موضوعتوضیح فنی
کاربرد اصلیخواندن یک ویژگی مشخص از ستون یا پارامتر با خروجی عددی
نوع خروجیint
Contextپایگاه داده یا نشست جاری، مطابق قرارداد تابع
حالت NULLورودی نامعتبر، نبود شیء یا نبود مجوز مشاهده متادیتا
کاربرد سازمانیاعتبارسنجی Schema، کشف ستون‌های Identity و Computed، تولید INSERT پویا، ساخت Data Dictionary و کنترل قابلیت Null
اصل مهم: خروجی تابع COLUMNPROPERTY را داده امنیتی قابل اعتماد فرض نکنید مگر اینکه مستندات همان property و مجوزهای Context این برداشت را تأیید کنند.

مثال‌های عملی مستقل و قابل اجرا

مثال 1: تشخیص ستون Identity

در این سناریو می‌خواهیم تشخیص ستون Identity را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'NewsID', 'IsIdentity') AS IsIdentity;
    
فیلد یا ستونخروجی نمونه
IsIdentity1

نکته کاربردی این مثال: یک یعنی ستون دارای ویژگی IDENTITY است. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 2: ساخت جدول نمونه با چند ویژگی

در این سناریو می‌خواهیم ساخت جدول نمونه با چند ویژگی را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

USE tempdb;
    CREATE TABLE #ColumnProps
    (
        Id int IDENTITY(1,1) NOT NULL,
        Qty int NULL,
        Total AS Qty * 2
    );
    SELECT COLUMNPROPERTY(OBJECT_ID(N'tempdb..#ColumnProps'), N'Total', 'IsComputed') AS IsComputed;
    DROP TABLE #ColumnProps;
    USE [a00b];
    
فیلد یا ستونخروجی نمونه
IsComputed1

نکته کاربردی این مثال: Context به tempdb تغییر داده شده و در پایان به پایگاه مقاله بازمی‌گردد. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 3: خواندن چند ویژگی در SELECT

در این سناریو می‌خواهیم خواندن چند ویژگی در SELECT را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT c.name,
           COLUMNPROPERTY(@Obj, c.name, 'ColumnId') AS ColumnId,
           COLUMNPROPERTY(@Obj, c.name, 'AllowsNull') AS AllowsNull
    FROM sys.columns AS c WHERE c.object_id = @Obj;
    
فیلد یا ستونخروجی نمونه
nameNewsID
ColumnId1
AllowsNull0

نکته کاربردی این مثال: خروجی چند property برای Data Dictionary قابل ترکیب است. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 4: فیلتر ستون‌های Identity

در این سناریو می‌خواهیم فیلتر ستون‌های Identity را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT name FROM sys.columns
    WHERE object_id = @Obj
      AND COLUMNPROPERTY(@Obj, name, 'IsIdentity') = 1;
    
فیلد یا ستونخروجی نمونه
nameNewsID

نکته کاربردی این مثال: sys.columns.is_identity نیز انتخاب مستقیم و مناسبی است. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 5: ترکیب با COL_NAME

در این سناریو می‌خواهیم ترکیب با COL_NAME را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT COL_NAME(@Obj, 1) AS ColumnName,
           COLUMNPROPERTY(@Obj, COL_NAME(@Obj, 1), 'ColumnId') AS VerifiedId;
    
فیلد یا ستونخروجی نمونه
ColumnNameNewsID
VerifiedId1

نکته کاربردی این مثال: این مثال سازگاری نگاشت نام و شناسه را نشان می‌دهد. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 6: مدیریت property نامعتبر

در این سناریو می‌خواهیم مدیریت property نامعتبر را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'NewsID', 'NoSuchProperty') AS InvalidProperty;
    
فیلد یا ستونخروجی نمونه
InvalidPropertyNULL

نکته کاربردی این مثال: قبل از تصمیم‌گیری تجاری خروجی NULL را از صفر تفکیک کنید. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 7: بررسی دقت ستون عددی نمونه

در این سناریو می‌خواهیم بررسی دقت ستون عددی نمونه را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

USE tempdb;
    CREATE TABLE #NumericMeta(Amount decimal(19,4));
    SELECT COLUMNPROPERTY(OBJECT_ID(N'tempdb..#NumericMeta'), N'Amount', 'Precision') AS NumericPrecision;
    DROP TABLE #NumericMeta;
    USE [a00b];
    
فیلد یا ستونخروجی نمونه
NumericPrecision19

نکته کاربردی این مثال: برای جزئیات کامل نوع، sys.columns و sys.types را نیز بخوانید. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 8: تولید فهرست ستون‌های قابل درج

در این سناریو می‌خواهیم تولید فهرست ستون‌های قابل درج را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Obj int = OBJECT_ID(N'dbo.tblNewsContent');
    SELECT c.name
    FROM sys.columns AS c
    WHERE c.object_id = @Obj
      AND COLUMNPROPERTY(@Obj, c.name, 'IsComputed') = 0
      AND COLUMNPROPERTY(@Obj, c.name, 'IsIdentity') = 0;
    
فیلد یا ستونخروجی نمونه
nameNewsGroupID / NewsTitle / ...

نکته کاربردی این مثال: این خروجی نقطه شروع تولید INSERT است، نه جایگزین قواعد دامنه. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 9: روش اشتباه و مدیریت سه‌حالته

در این سناریو می‌خواهیم روش اشتباه و مدیریت سه‌حالته را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

DECLARE @Value int = COLUMNPROPERTY(OBJECT_ID(N'dbo.NoTable'), N'Id', 'IsIdentity');
    SELECT CASE WHEN @Value = 1 THEN N'بله'
                WHEN @Value = 0 THEN N'خیر'
                ELSE N'نامعتبر یا غیرقابل مشاهده' END AS Result;
    
فیلد یا ستونخروجی نمونه
Resultنامعتبر یا غیرقابل مشاهده

نکته کاربردی این مثال: NULL نباید خودکار به خیر تبدیل شود. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

مثال 10: استفاده مستقیم از sys.columns برای گزارش انبوه

در این سناریو می‌خواهیم استفاده مستقیم از sys.columns برای گزارش انبوه را با تابع COLUMNPROPERTY پیاده‌سازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.

SELECT c.name, c.is_identity, c.is_computed, c.is_nullable
    FROM sys.columns AS c
    WHERE c.object_id = OBJECT_ID(N'dbo.tblNewsContent');
    
فیلد یا ستونخروجی نمونه
nameNewsID
is_identity1
is_computed0
is_nullable0

نکته کاربردی این مثال: برای هزاران ستون، ستون‌های کاتالوگ معمولاً سریع‌تر و گویا‌ترند. نتیجه نمایش‌داده‌شده نمونه است و شناسه‌ها، نام‌ها یا اندازه‌ها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.

خطاهای رایج و روش عیب‌یابی

نخستین خطای رایج در COLUMNPROPERTY اجرای Query در پایگاه داده نادرست است. قبل از تحلیل نتیجه، DB_NAME()، نام Schema و شناسه ورودی را ثبت کنید. اگر خروجی NULL است، جداگانه وجود شیء، صحت نام، نوع شیء و مجوز VIEW DEFINITION یا مجوز مرتبط را بررسی کنید.

خطای دوم، چسباندن خروجی تابع به SQL پویا بدون اعتبارسنجی است. نامی که قرار است به‌عنوان Identifier استفاده شود باید از منبع مورد اعتماد بیاید و با QUOTENAME محصور شود؛ مقدارهای تجاری نیز باید با sp_executesql پارامتری شوند. معنای صفر، یک و NULL به property وابسته است؛ نام property نامعتبر، شیء نامعتبر یا نبود مجوز معمولاً NULL ایجاد می‌کند.

  • Context جاری را با SELECT DB_NAME() کنترل کنید.
  • نام‌های شیء را همراه Schema بنویسید و از حدس Schema پیش‌فرض دوری کنید.
  • برای NULL پیام تشخیصی بسازید و آن را خودکار به صفر تبدیل نکنید.
  • نتیجه را با نمای کاتالوگ مرتبط، مانند sys.objects، sys.columns یا sys.types، تطبیق دهید.
  • مجوز مشاهده متادیتا را با کمترین سطح دسترسی لازم طراحی کنید.

ملاحظات کارایی و بهینه‌سازی Query

هزینه یک اجرای COLUMNPROPERTY معمولاً در مقایسه با خواندن داده‌های بزرگ ناچیز است، ولی قرار دادن آن روی هر ردیف یک DMV یا کاتالوگ بزرگ می‌تواند CPU و زمان اجرای قابل مشاهده بسازد. وقتی ورودی ثابت است، مقدار را یک‌بار در متغیر ذخیره کنید. وقتی چند ویژگی از هزاران شیء لازم است، Join مستقیم به نماهای sys اغلب Plan شفاف‌تری ایجاد می‌کند.

برای اندازه‌گیری واقعی، SET STATISTICS IO, TIME ON و Actual Execution Plan را در محیط آزمایشی فعال کنید. نسخه تابعی و نسخه Join را با داده و مجوز یکسان مقایسه کنید. از Scalar Function در سمت ستون شرط، اگر تبدیل مستقیم به شناسه یا Join ممکن است، پرهیز کنید تا Predicate ساده‌تر باقی بماند.

SET STATISTICS IO, TIME ON;
    DECLARE @ContextName sysname = DB_NAME();
    -- Query مبتنی بر متادیتا را اینجا اجرا و Plan واقعی را بررسی کنید.
    SELECT @ContextName AS DatabaseContext;
    SET STATISTICS IO, TIME OFF;
    

هدف بهینه‌سازی حذف کورکورانه تابع نیست؛ هدف آن است که تابع در نقطه‌ای اجرا شود که اطلاعات لازم را با کمترین تکرار و روشن‌ترین قرارداد فراهم کند. تغییر باید با اندازه‌گیری قبل و بعد تأیید شود.

بهترین روش‌ها و کاربرد در پروژه سازمانی

  1. نام پایگاه داده و Schema را بخشی از قرارداد اجرای اسکریپت بدانید.
  2. خروجی COLUMNPROPERTY را به‌همراه ورودی و Context در لاگ خطا ثبت کنید.
  3. برای Migration، شرط وجود را با نوع شیء مورد انتظار ترکیب کنید.
  4. در کد تولیدی، شاخه جداگانه‌ای برای NULL و نبود مجوز در نظر بگیرید.
  5. برای گزارش‌های انبوه، نماهای کاتالوگ را با نسخه تابعی Benchmark کنید.
  6. شناسه‌های داخلی را میان Development، Test و Production کپی نکنید.
  7. SQL پویا را با QUOTENAME و sp_executesql ایمن کنید.
  8. تست خودکار را پس از تغییر Schema و ارتقای نسخه SQL Server اجرا کنید.

یک کاربرد واقعی COLUMNPROPERTY، ساخت ماژول Metadata-driven برای اعتبارسنجی Schema، کشف ستون‌های Identity و Computed، تولید INSERT پویا، ساخت Data Dictionary و کنترل قابلیت Null است. چنین ماژولی باید خروجی نسخه‌بندی‌شده، کنترل مجوز، ثبت زمان اجرا و تست بازگشت داشته باشد. در پروژه‌های حساس، نتیجه با منبع دوم مانند نمای کاتالوگ تطبیق داده می‌شود تا تغییرات غیرمنتظره سریع شناسایی شوند.

سؤالات متداول اختصاصی

۱. تابع COLUMNPROPERTY دقیقاً چه مسئله‌ای را حل می‌کند؟

COLUMNPROPERTY برای خواندن یک ویژگی مشخص از ستون یا پارامتر با خروجی عددی به کار می‌رود. مزیت آن این است که به‌جای حدس‌زدن یا Hard-code کردن شناسه‌ها و نام‌ها، پاسخ را از متادیتای همان Context دریافت می‌کنیم. در یک سامانه حرفه‌ای، خروجی باید همراه با کنترل NULL و ثبت Context مصرف شود تا نتیجه قابل اعتماد و قابل عیب‌یابی باشد.

۲. برای شروع استفاده از COLUMNPROPERTY چه پیش‌نیازی لازم است؟

کاربر باید در پایگاه داده درست متصل باشد، ورودی معتبر بدهد و اجازه مشاهده متادیتای شیء هدف را داشته باشد. بهتر است ابتدا نمونه ساده مقاله اجرا شود و سپس Query با نام‌های واقعی Schema و اشیای سازمان جایگزین گردد. برای رشته‌های فارسی نیز پیشوند N باید حفظ شود.

۳. آیا آموزش و پیاده‌سازی سازمانی COLUMNPROPERTY ارزش تجاری دارد؟

بله؛ استفاده صحیح از متادیتا زمان توسعه ابزارهای گزارش‌گیری، مهاجرت، ممیزی و نگهداری را کم می‌کند و خطای انسانی ناشی از مقادیر ثابت را کاهش می‌دهد. در دوره آموزشی یا مشاوره SQL Server می‌توان این تابع را در قالب یک چارچوب Metadata-driven واقعی، همراه با تست و کنترل مجوزها، پیاده‌سازی کرد.

۴. COLUMNPROPERTY چگونه هزینه پروژه‌های پایگاه داده را کاهش می‌دهد؟

وقتی قواعد کشف Schema یک‌بار و درست نوشته شوند، همان کد در چند محیط و چند نسخه پایگاه داده قابل استفاده است. این کار دوباره‌کاری در Deployment و گزارش‌سازی را کم می‌کند. البته صرف استفاده از تابع کافی نیست و باید قرارداد نام‌گذاری، ثبت خطا و آزمون تغییرات نیز در پروژه تعریف شود.

۵. تفاوت استفاده از COLUMNPROPERTY با خواندن مستقیم نماهای sys چیست؟

COLUMNPROPERTY برای دریافت یک ویژگی یا تبدیل مشخص، کوتاه و خواناست؛ در مقابل، نماهای کاتالوگ sys برای گزارش انبوه، فیلتر چندویژگی و Joinهای تحلیلی انعطاف بیشتری دارند. انتخاب درست به حجم داده، نیاز به جزئیات و شکل Plan بستگی دارد و در بسیاری از ابزارها هر دو روش کنار هم استفاده می‌شوند.

۶. آیا می‌توان برای طراحی ابزار یا گزارش اختصاصی COLUMNPROPERTY مشاوره گرفت؟

بله؛ در یک خدمت تحلیل یا اجرای پروژه SQL Server ابتدا سناریو، مجوزها، نسخه موتور و اندازه کاتالوگ بررسی می‌شود. سپس Queryهای متادیتا با خروجی پایدار، لاگ خطا، تست خودکار و مستندات تحویل داده می‌شوند تا ابزار به یک نمونه نمایشی محدود نماند.

۷. رایج‌ترین خطای COLUMNPROPERTY چیست؟

رایج‌ترین خطا تفسیر NULL به‌عنوان پاسخ منفی قطعی است؛ درحالی‌که NULL ممکن است از ورودی نامعتبر، Context اشتباه یا نبود مجوز مشاهده متادیتا ناشی شود. خطای دیگر استفاده از نام بدون Schema یا فرض ثابت بودن شناسه‌ها میان پایگاه‌های داده است. معنای صفر، یک و NULL به property وابسته است؛ نام property نامعتبر، شیء نامعتبر یا نبود مجوز معمولاً NULL ایجاد می‌کند.

۸. اجرای COLUMNPROPERTY چه اثری بر Performance دارد؟

یک فراخوانی منفرد معمولاً بسیار سبک است، اما اجرای تابع برای هر ردیف یک مجموعه بزرگ یا در شرطی که Join مستقیم کاتالوگ مناسب‌تر است می‌تواند هزینه اضافی بسازد. مقدارهای ثابت را یک‌بار در متغیر محاسبه کنید، Actual Execution Plan و STATISTICS IO را بررسی کنید و برای گزارش‌های انبوه از نماهای sys استفاده آگاهانه داشته باشید.

۹. Best Practice اصلی برای COLUMNPROPERTY چیست؟

Context را صریح نگه دارید، نام‌ها را Schema-qualified بنویسید، ورودی و خروجی NULL را کنترل کنید و شناسه‌های متادیتا را در محیط دیگر Hard-code نکنید. همچنین اگر خروجی وارد SQL پویا می‌شود، نام اشیا را با QUOTENAME محصور کنید و مقدارهای داده را پارامتری نگه دارید.

۱۰. COLUMNPROPERTY با کدام نسخه‌های SQL Server سازگار است؟

این تابع از توابع جاافتاده Transact-SQL است، اما دامنه propertyها، مجوزهای لازم و سطح پشتیبانی در SQL Server، Azure SQL Database، Managed Instance و سرویس‌های تحلیلی می‌تواند متفاوت باشد. پیش از استقرار، مستندات نسخه هدف و Compatibility Level را بررسی و Query را در محیط آزمایشی همان پلتفرم اجرا کنید.

سؤالات مصاحبه SQL Server

۱. چرا COLUMNPROPERTY ممکن است NULL برگرداند؟

ورودی نامعتبر، Context نادرست، property ناسازگار یا محدودیت Metadata Visibility از علت‌های اصلی هستند. پاسخ حرفه‌ای باید روش تفکیک این علت‌ها را نیز توضیح دهد.

۲. چه زمانی نمای sys را به COLUMNPROPERTY ترجیح می‌دهید؟

وقتی چند ستون متادیتا برای مجموعه بزرگی از اشیا لازم است، Join و فیلتر مستقیم کاتالوگ معمولاً خواناتر و قابل‌بهینه‌سازی‌تر است. برای یک تبدیل یا ویژگی منفرد، تابع می‌تواند ساده‌تر باشد.

۳. چرا شناسه‌های متادیتا نباید Hard-code شوند؟

زیرا شناسه‌ها در پایگاه دیگر، پس از بازسازی شیء یا در محیط استقرار متفاوت می‌توانند تغییر کنند. نام معتبر یا کاتالوگ باید در زمان اجرا شناسه را حل کند.

۴. Metadata Visibility چه اثری بر نتیجه دارد؟

کاربر معمولاً فقط متادیتای Securableهایی را می‌بیند که مالک آن‌هاست یا مجوز مرتبط دارد. بنابراین NULL الزاماً نبود شیء را ثابت نمی‌کند.

۵. چگونه کارایی Query متادیتا را می‌سنجید؟

نسخه‌ها را با IO، TIME، Plan واقعی، تعداد ردیف و مجوز یکسان مقایسه می‌کنم و تکرار تابع، Predicate و Joinهای کاتالوگ را بررسی می‌کنم.

چک‌لیست نهایی

  • Syntax تابع COLUMNPROPERTY با نوع ورودی صحیح نوشته شده است.
  • Context پایگاه داده و Schema پیش از اجرا کنترل شده‌اند.
  • NULL، صفر و یک بر اساس قرارداد property از هم تفکیک شده‌اند.
  • هیچ شناسه داخلی بین محیط‌ها Hard-code نشده است.
  • نام‌های واردشده به SQL پویا با QUOTENAME ایمن شده‌اند.
  • نسخه کاتالوگی برای گزارش‌های انبوه بررسی و Benchmark شده است.
  • مجوز مشاهده متادیتا با اصل حداقل دسترسی تنظیم شده است.
  • تست پس از تغییر Schema و ارتقای SQL Server وجود دارد.

جمع‌بندی

COLUMNPROPERTY ابزاری دقیق برای خواندن یک ویژگی مشخص از ستون یا پارامتر با خروجی عددی است، به شرط آنکه Context، مجوز و معنای NULL جدی گرفته شود. مثال‌های این مقاله نشان دادند چگونه از Query ساده به ممیزی سازمانی، مدیریت خطا و انتخاب روش کاراتر برسیم.

برای مقایسه این تابع با سایر اعضای خانواده و دسترسی به مقاله‌های مرتبط، به مقاله مادر توابع Metadata در SQL Server بازگردید. در پیاده‌سازی نهایی، مستندات نسخه هدف و Plan واقعی Query مرجع تصمیم باشند.

 

0 نظر

نظر محترم شما در مورد مقاله های وب سایت برنامه نویسی و پایگاه داده

نظرات محترم شما در خدمات رسانی بهتر ما را یاری می نمایند. لطفا اگر مایل بودید یک نظر ما را مهمان فرمائید. آدرس ایمیل و وب سایت شما نمایش داده نخواهد شد.

حرف 500 حداکثر

اطلاعات تماس

  • آدرس:اصفهان-خیابان ام کلثوم غربی - بعد خیابان تخم چی - بیست متر بعد از پیتزا ننه شب - کوچه تعمیر گاه سمار زغالی - پلاک 354 - درب مشکی - طبقه هفتم
  • آدرس ایمیل:najafzade@gmail.com
  • وب سایت:http://www.a00b.com/
  • تلفن ثابت:(+98)9131253620
  • تلفن همراه:09131253620