مثالهای عملی مستقل و قابل اجرا
مثال 1: تشخیص ستون Identity
در این سناریو میخواهیم تشخیص ستون Identity را با تابع COLUMNPROPERTY پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'NewsID', 'IsIdentity') AS IsIdentity;
| فیلد یا ستون | خروجی نمونه |
|---|
| IsIdentity | 1 |
نکته کاربردی این مثال: یک یعنی ستون دارای ویژگی 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];
| فیلد یا ستون | خروجی نمونه |
|---|
| IsComputed | 1 |
نکته کاربردی این مثال: 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;
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsID |
| ColumnId | 1 |
| AllowsNull | 0 |
نکته کاربردی این مثال: خروجی چند 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;
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsID |
نکته کاربردی این مثال: 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;
| فیلد یا ستون | خروجی نمونه |
|---|
| ColumnName | NewsID |
| VerifiedId | 1 |
نکته کاربردی این مثال: این مثال سازگاری نگاشت نام و شناسه را نشان میدهد. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 6: مدیریت property نامعتبر
در این سناریو میخواهیم مدیریت property نامعتبر را با تابع COLUMNPROPERTY پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT COLUMNPROPERTY(OBJECT_ID(N'dbo.tblNewsContent'), N'NewsID', 'NoSuchProperty') AS InvalidProperty;
| فیلد یا ستون | خروجی نمونه |
|---|
| InvalidProperty | NULL |
نکته کاربردی این مثال: قبل از تصمیمگیری تجاری خروجی 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];
| فیلد یا ستون | خروجی نمونه |
|---|
| NumericPrecision | 19 |
نکته کاربردی این مثال: برای جزئیات کامل نوع، 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;
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsGroupID / 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');
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsID |
| is_identity | 1 |
| is_computed | 0 |
| is_nullable | 0 |
نکته کاربردی این مثال: برای هزاران ستون، ستونهای کاتالوگ معمولاً سریعتر و گویاترند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
سؤالات متداول اختصاصی
۱. تابع 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 را در محیط آزمایشی همان پلتفرم اجرا کنید.