آموزش جامع تابع SERVERPROPERTY در SQL Server با ۱۰ مثال عملی
هنگامی که یک گزارش فنی باید هم برای DBA و هم برای توسعهدهنده قابل استفاده باشد، انتخاب تابع کمکی درست اهمیت زیادی پیدا میکند. در این مقاله، SERVERPROPERTY از سطح مقدماتی تا سناریوهای حرفهای بررسی میشود و هر مثال با خروجی نمونه ارائه شده است.
تشخیص Edition، Version، نام ماشین، Collation، قابلیت HADR و وضعیت Cluster از کاربردهای متداول آن است. تمرکز آموزش بر این است که SERVERPROPERTY در چه Contextی اجرا شود، نتیجه آن چگونه تفسیر شود و چه زمانی باید از یک DMV یا کاتالوگویوی جایگزین کمک گرفت.
برای مشاهده جایگاه SERVERPROPERTY میان سایر توابع و شمارندهها، راهنمای جامع توابع کمکی کارایی و Metadata در SQL Server را نیز مطالعه کنید.
تعریف و کاربرد اصلی SERVERPROPERTY
تابع SERVERPROPERTY مقدار یکی از ویژگیهای Instance یا موتور SQL Server را بهصورت sql_variant برمیگرداند. این تعریف در ظاهر کوتاه است، اما استفاده درست از SERVERPROPERTY به درک مفاهیمی مانند ProductVersion، Edition و ServerName وابسته است.
قاعده عملی SERVERPROPERTY: ابتدا ورودی و Context را معتبر کنید، سپس خروجی را با نوع داده و معنای واقعی آن تفسیر کنید.
Syntax تابع یا متغیر SERVERPROPERTY
SELECT SERVERPROPERTY ( 'propertyname' ) AS Result;
پارامترهای SERVERPROPERTY
| پارامتر | توضیح |
|---|
| propertyname | نام ویژگی پشتیبانیشده مانند ProductVersion، Edition، ServerName یا IsHadrEnabled. |
نوع خروجی و رفتار NULL در SERVERPROPERTY
sql_variant؛ نوع واقعی خروجی به Property وابسته است و نام نامعتبر معمولاً NULL میدهد. در کد تولیدی بهتر است نوع مقصد بهصورت صریح تعیین شود؛ زیرا تبدیل ضمنی میتواند مقایسه، مرتبسازی یا ذخیره نتیجه SERVERPROPERTY را مبهم کند.
مفاهیم کلیدی مرتبط با SERVERPROPERTY
- ProductVersion
- Edition
- ServerName
- Collation در مبحث SERVERPROPERTY
- IsHadrEnabled
- sql_variant در مبحث SERVERPROPERTY
- instance metadata
تصویر نخست، ارتباط SERVERPROPERTY را با مفاهیم اختصاصی ProductVersion، Edition، ServerName و Collation نشان میدهد؛ این روابط مبنای انتخاب ورودی و تفسیر خروجی هستند.
سناریوهای واقعی استفاده از SERVERPROPERTY
سناریوی 1 برای SERVERPROPERTY، «Inventory سرورها» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 2 برای SERVERPROPERTY، «اسکریپت نصب شرطی» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 3 برای SERVERPROPERTY، «کنترل HADR» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
سناریوی 4 برای SERVERPROPERTY، «ثبت نسخه در گزارش خطا» است. در این حالت باید نتیجه همراه Context پایگاه داده، زمان نمونهبرداری و در صورت نیاز شناسه نشست ثبت شود تا داده برای عیبیابی بعدی ارزش داشته باشد.
مثالهای عملی SERVERPROPERTY از ساده تا حرفهای
مثال 1: نسخه محصول
ProductVersion را از Instance میخوانیم. این سناریو بهطور اختصاصی برای درک رفتار SERVERPROPERTY طراحی شده است.
SELECT SERVERPROPERTY(N'ProductVersion') AS ProductVersion;
| ProductVersion |
|---|
| 16.0.4125.3 |
رشته نسخه را برای مقایسه دقیق به اجزای عددی تفکیک کنید. هنگام استفاده سازمانی از SERVERPROPERTY، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 2: Edition سرور
Edition نصبشده را گزارش میکنیم. این سناریو بهطور اختصاصی برای درک رفتار SERVERPROPERTY طراحی شده است.
SELECT SERVERPROPERTY(N'Edition') AS Edition;
| Edition |
|---|
| Developer Edition (64-bit) |
قابلیتها و مجوزها به Edition وابستهاند. هنگام استفاده سازمانی از SERVERPROPERTY، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 3: نام Server و Instance
نام ثبتشده Instance را نمایش میدهیم. این سناریو بهطور اختصاصی برای درک رفتار SERVERPROPERTY طراحی شده است.
SELECT SERVERPROPERTY(N'ServerName') AS ServerName,
SERVERPROPERTY(N'MachineName') AS MachineName,
SERVERPROPERTY(N'InstanceName') AS InstanceName;
| ServerName | MachineName | InstanceName |
|---|
| DBHOST\SQL2022 | DBHOST | SQL2022 |
برای Default Instance مقدار InstanceName میتواند NULL باشد. هنگام استفاده سازمانی از SERVERPROPERTY، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
مثال 4: Collation سرور
Collation پیشفرض Instance را میخوانیم. این سناریو بهطور اختصاصی برای درک رفتار SERVERPROPERTY طراحی شده است.
SELECT SERVERPROPERTY(N'Collation') AS ServerCollation;
| ServerCollation |
|---|
| SQL_Latin1_General_CP1_CI_AS |
Database یا Column ممکن است Collation متفاوت داشته باشد. هنگام استفاده سازمانی از SERVERPROPERTY، خروجی نمونه را با داده واقعی محیط خود تطبیق دهید.
تصویر دوم، جریان اجرای SERVERPROPERTY را از ورودی و اعتبارسنجی تا تولید خروجی نمایش میدهد و نشان میدهد که IsHadrEnabled در کدام مرحله باید کنترل شود.
ادامه مثالهای پیشرفته SERVERPROPERTY
مثال 5: وضعیت HADR
قابلیت Always On را بررسی میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
SELECT CAST(SERVERPROPERTY(N'IsHadrEnabled') AS int) AS IsHadrEnabled;
فعال بودن قابلیت به معنای وجود Availability Group نیست. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
مثال 6: تشخیص نوع Engine Edition
خروجی عددی را Cast میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
SELECT CAST(SERVERPROPERTY(N'EngineEdition') AS int) AS EngineEditionCode;
کد EngineEdition برای تشخیص محیطهای Database Engine، Azure و دیگر گونهها مفید است. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
مثال 7: مدیریت Property نامعتبر
نام اشتباه را بهصورت کنترلشده نمایش میدهیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
SELECT COALESCE(
CONVERT(nvarchar(128), SERVERPROPERTY(N'NotARealProperty')),
N'NULL'
) AS Result;
اسکریپت سازگار باید Propertyهای جدید یا غایب را تحمل کند. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
مثال 8: ساخت Inventory یکردیفی
چند Property اصلی را در یک گزارش گردآوری میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
SELECT
CONVERT(nvarchar(128), SERVERPROPERTY(N'ServerName')) AS ServerName,
CONVERT(nvarchar(128), SERVERPROPERTY(N'ProductVersion')) AS ProductVersion,
CONVERT(nvarchar(128), SERVERPROPERTY(N'ProductLevel')) AS ProductLevel,
CONVERT(nvarchar(128), SERVERPROPERTY(N'Edition')) AS Edition;
| ServerName | ProductVersion | ProductLevel | Edition |
|---|
| DBHOST\SQL2022 | 16.0.4125.3 | CU18 | Developer Edition |
تبدیل صریح sql_variant خروجی را برای Export یکنواخت میکند. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
مثال 9: روش اشتباه مقایسه نسخه
Major version را عددی استخراج میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
DECLARE @Version nvarchar(128) =
CONVERT(nvarchar(128), SERVERPROPERTY(N'ProductVersion'));
SELECT TRY_CONVERT(int, PARSENAME(@Version, 4)) AS MajorVersion;
مقایسه رشتهای 9 و 10 نتیجه نادرست میدهد؛ عدد Major را جدا کنید. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
مثال 10: شرط نصب سازگار
بر اساس Major Version مسیر اسکریپت را انتخاب میکنیم. در این مثال، هدف تنها اجرای Query نیست؛ بلکه نشان دادن یک تصمیم فنی صحیح پیرامون SERVERPROPERTY است.
DECLARE @MajorVersion int =
TRY_CONVERT(int, PARSENAME(
CONVERT(nvarchar(128), SERVERPROPERTY(N'ProductVersion')), 4));
SELECT CASE
WHEN @MajorVersion >= 16 THEN N'قابلیتهای SQL Server 2022 قابل بررسی است'
WHEN @MajorVersion >= 15 THEN N'قابلیتهای SQL Server 2019 قابل بررسی است'
ELSE N'مسیر سازگاری قدیمی اجرا شود'
END AS DeploymentPath;
| DeploymentPath |
|---|
| قابلیتهای SQL Server 2022 قابل بررسی است |
نسخه تنها شرط نیست؛ Compatibility Level و Edition را نیز کنترل کنید. این نکته از تفسیر سطحی یا استفاده تکراری و بیهدف از SERVERPROPERTY جلوگیری میکند.
خطاهای رایج در کار با SERVERPROPERTY
خطای 1 در استفاده از SERVERPROPERTY
برای مقایسه عددی، sql_variant را به نوع مناسب CAST کنید. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه SERVERPROPERTY را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 2 در استفاده از SERVERPROPERTY
ProductVersion رشته چندبخشی است و مقایسه لغوی میتواند غلط باشد. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه SERVERPROPERTY را پیش از ادامه منطق با شرط صریح کنترل کنید.
خطای 3 در استفاده از SERVERPROPERTY
همه Propertyها در همه Editionها یا محیطهای ابری معنای یکسان ندارند. برای رفع این مشکل، ورودی و Context را از منبع معتبر بخوانید و نتیجه SERVERPROPERTY را پیش از ادامه منطق با شرط صریح کنترل کنید.
ملاحظات Performance برای SERVERPROPERTY
از نظر کارایی، SERVERPROPERTY زمانی کمهزینه باقی میماند که روی یک مقدار هدفمند یا مجموعه محدود اجرا شود. فراخوانی آن روی هزاران ردیف بدون Predicate اولیه میتواند CPU و زمان گزارش را افزایش دهد.
اگر گزارش به چند Property از چندین شیء نیاز دارد، استفاده Set-based از کاتالوگویو یا DMV مرتبط با ProductVersion معمولاً بهتر از تکرار SERVERPROPERTY برای هر سلول است.
در Jobهای دورهای، نتیجه SERVERPROPERTY را همراه Timestamp ذخیره کنید، اما Frequency نمونهبرداری را متناسب با سرعت تغییر داده انتخاب کنید. جمعآوری بیش از حد، جدول تاریخچه را بدون ارزش تحلیلی بزرگ میکند.
برای محاسبات عددی پیرامون SERVERPROPERTY، نوع داده را قبل از ضرب یا تفریق ارتقا دهید و در سناریوهای تجمعی، Restart و بازنشانی Baseline را در نظر بگیرید.
Best Practiceهای اختصاصی SERVERPROPERTY
- ورودی SERVERPROPERTY را از نام یا شناسه معتبر و دارای Schema یا Context روشن تأمین کنید.
- نتیجه NULL در SERVERPROPERTY را از مقدار صفر، false یا رشته خالی جدا نگه دارید.
- نوع خروجی SERVERPROPERTY را پیش از ذخیره یا مقایسه به نوع مقصد مناسب تبدیل کنید.
- در گزارشهای بزرگ، گزینه Set-based مرتبط با ProductVersion را ارزیابی کنید.
- زمان Capture، نام Database و در صورت نیاز @@SPID را کنار نتیجه SERVERPROPERTY ثبت کنید.
- مجوز مشاهده Metadata یا DMV را با حداقل سطح دسترسی لازم تنظیم کنید. در مبحث SERVERPROPERTY
- مثالهای SERVERPROPERTY را روی نسخه و Edition واقعی محیط هدف آزمایش کنید.
- برای SQL پویا، خروجی نامی SERVERPROPERTY را با QUOTENAME و پارامترسازی ایمن مصرف کنید.
تصویر سوم، تفاوت روش پرخطر و Best Practice در استفاده از SERVERPROPERTY را مقایسه میکند؛ هدف آن جلوگیری از خطاهای مربوط به برای مقایسه عددی، sql_variant را به نوع مناسب CAST کنید. و بهبود تصمیمگیری فنی است.
سؤالات متداول اختصاصی SERVERPROPERTY
SERVERPROPERTY دقیقاً چه مسئلهای را در SQL Server حل میکند؟
تابع SERVERPROPERTY مقدار یکی از ویژگیهای Instance یا موتور SQL Server را بهصورت sql_variant برمیگرداند. در عمل، تشخیص Edition، Version، نام ماشین، Collation، قابلیت HADR و وضعیت Cluster از کاربردهای متداول آن است. بنابراین استفاده از SERVERPROPERTY زمانی ارزشمند است که خروجی آن در یک تصمیم فنی روشن مصرف شود، نه اینکه فقط برای نمایش عدد یا نام به کار رود.
نوع خروجی SERVERPROPERTY چیست و چگونه باید آن را مدیریت کرد؟
نوع خروجی این ابزار چنین است: sql_variant؛ نوع واقعی خروجی به Property وابسته است و نام نامعتبر معمولاً NULL میدهد. بهتر است پیش از تبدیل نوع، مقایسه یا درج در جدول گزارش، حالت NULL و محدوده مقدار را صریح کنترل کنید تا رفتار SERVERPROPERTY قابل پیشبینی بماند.
آیا SERVERPROPERTY در گزارشهای سازمانی کاربرد تجاری دارد؟
بله. در سناریوهایی مانند Inventory سرورها و اسکریپت نصب شرطی، خروجی SERVERPROPERTY میتواند کیفیت گزارش مدیریتی را بالا ببرد. ارزش تجاری زمانی ایجاد میشود که این داده به هشدار، ظرفیتسنجی یا کاهش زمان عیبیابی متصل شود.
استفاده از SERVERPROPERTY در پروژههای بزرگ چه مزیتی دارد؟
در پروژه بزرگ، استانداردسازی نحوه استفاده از SERVERPROPERTY باعث میشود تیم توسعه، DBA و پشتیبانی یک تعریف مشترک از ProductVersion و Edition داشته باشند. این هماهنگی خطاهای تفسیر و دوبارهکاری را کاهش میدهد.
تفاوت SERVERPROPERTY با گزینه نزدیک آن چیست؟
SERVERPROPERTY ویژگیهای Instance را میدهد، در حالی که DATABASEPROPERTYEX به یک Database مشخص مربوط است. انتخاب صحیح باید بر اساس حجم داده، نیاز به خروجی Set-based و سطح جزئیات گزارش انجام شود؛ یک تابع scalar همیشه جایگزین کاتالوگویو یا DMV کامل نیست.
برای طراحی اسکریپت حرفهای مبتنی بر SERVERPROPERTY چه خدماتی لازم میشود؟
در پروژههای حساس میتوان منطق SERVERPROPERTY را در قالب رویه مانیتورینگ، Dashboard، گزارش زمانبندیشده یا کنترل Deployment پیاده کرد. تحلیل نیاز، تست روی نسخه واقعی SQL Server و مستندسازی خروجی، بخشهای مهم خدمات مشاوره و انجام پروژه هستند.
رایجترین خطا هنگام کار با SERVERPROPERTY چیست؟
یکی از خطاهای مهم این است که برای مقایسه عددی، sql_variant را به نوع مناسب CAST کنید. همچنین نادیده گرفتن NULL یا Context اجرای Query میتواند نتیجهای ظاهراً معتبر ولی از نظر عملیاتی اشتباه تولید کند.
آیا فراخوانی زیاد SERVERPROPERTY بر Performance اثر میگذارد؟
یک فراخوانی منفرد معمولاً سبک است، اما اجرای SERVERPROPERTY روی مجموعه بسیار بزرگ یا در شرطی که برای هر ردیف محاسبه شود میتواند هزینه ایجاد کند. ابتدا ردیفها را محدود کنید و در گزارشهای وسیع، جایگزین Set-based را ارزیابی کنید.
بهترین روش استفاده از SERVERPROPERTY چیست؟
بهترین روش این است که ورودی SERVERPROPERTY اعتبارسنجی، نوع خروجی صریح، حالت NULL مدیریت و نتیجه همراه زمان و Context ثبت شود. همچنین باید مشخص باشد که خروجی برای نمایش، کنترل ایمنی یا تصمیم کارایی مصرف میشود.
SERVERPROPERTY با کدام نسخههای SQL Server سازگار است؟
فهرست Propertyها در طول نسخهها توسعه یافته است؛ اسکریپت باید برای Propertyهای اختیاری تحمل NULL داشته باشد. با این حال، هنگام انتقال اسکریپت به Azure SQL یا Edition دیگر، Propertyها، مجوزهای Metadata و تفاوتهای پلتفرم را روی همان محیط آزمایش کنید.
سؤالات مصاحبه درباره SERVERPROPERTY
در مصاحبه چگونه تفاوت ورودی و خروجی SERVERPROPERTY را توضیح میدهید؟
پاسخ مناسب باید Syntax یعنی SERVERPROPERTY ( 'propertyname' )، نوع خروجی و شرایط NULL را توضیح دهد و یک نمونه از Inventory سرورها ارائه کند.
چه زمانی بهجای SERVERPROPERTY از کاتالوگویو یا DMV استفاده میکنید؟
وقتی گزارش چندین ردیف و چند Property نیاز دارد، روش Set-based معمولاً مناسبتر است؛ SERVERPROPERTY برای تبدیل یا بررسی هدفمند یک مقدار بسیار خواناست.
چگونه نتیجه نامعتبر SERVERPROPERTY را از مقدار false یا صفر جدا میکنید؟
با بررسی صریح IS NULL، اعتبارسنجی ورودی و در صورت نیاز Join با Metadata منبع، علت نتیجه را روشن میکنم. این توضیح بهطور اختصاصی به SERVERPROPERTY مربوط است.
چه نکته Performance درباره SERVERPROPERTY مهم است؟
فراخوانی را پس از محدود کردن مجموعه داده انجام میدهم و از محاسبه تکراری SERVERPROPERTY در SELECT و WHERE جلوگیری میکنم.
یک سناریوی واقعی برای SERVERPROPERTY بیان کنید.
سناریوی مناسب میتواند کنترل HADR باشد؛ در آن خروجی همراه Timestamp، نام Database و شناسه نشست ثبت میشود تا قابل پیگیری باشد.
چکلیست نهایی استفاده از SERVERPROPERTY
- Syntax SERVERPROPERTY و ورودیهای آن با نسخه هدف تطبیق داده شده است.
- Context پایگاه داده یا Instance برای SERVERPROPERTY روشن است.
- مجوز لازم برای Metadata یا DMV بررسی شده است. در مبحث SERVERPROPERTY
- NULL، مقدار نامعتبر و حالت مرزی SERVERPROPERTY تست شده است.
- نمونه خروجی با نوع داده واقعی مقایسه شده است. در مبحث SERVERPROPERTY
- در Query بزرگ، هزینه فراخوانی تکراری SERVERPROPERTY اندازهگیری شده است.
- جایگزین Set-based برای گزارش انبوه ارزیابی شده است. در مبحث SERVERPROPERTY
- نتیجه نهایی همراه Timestamp و توضیح عملیاتی ثبت میشود. در مبحث SERVERPROPERTY
جمعبندی آموزش SERVERPROPERTY
SERVERPROPERTY ابزاری کوچک اما مؤثر برای تشخیص Edition، Version، نام ماشین، Collation، قابلیت HADR و وضعیت Cluster از کاربردهای متداول آن است. است. استفاده حرفهای از آن به اعتبارسنجی ورودی، تفسیر نوع خروجی، کنترل NULL و انتخاب Scope مناسب وابسته است.
پس از تسلط بر SERVERPROPERTY، برای مقایسه آن با سایر ابزارهای این مجموعه به مقاله مادر توابع کمکی Performance و Metadata در SQL Server بازگردید.
خدمات برنامهنویسی و پایگاه داده
برنامهنویسی در اصفهان
قبول سفارشهای برنامهنویسی و پایگاه داده: 09131253620
انجام پروژههای برنامهنویسی، آموزش برنامهنویسی و آموزش پایگاه داده SQL Server با رویکرد حرفهای، مستند و قابل توسعه انجام میشود.
مجموعهای معتبر با سابقه فعالیت حرفهای از سال ۱۳۷۵ شمسی
از سال ۱۳۷۵ شمسی تاکنون در زمینه طراحی و اجرای پروژههای برنامهنویسی، پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری فعالیت میکنیم.
برای سفارش پروژههای برنامهنویسی و پایگاه داده، سیستمهای تحت وب، وبسایت و راهکارهای نرمافزاری جدید، با شماره تلفن همراه 09131253620 تماس حاصل فرمایید.
ایتا، واتساپ و تماس مستقیم: +989131253620
تماس با ما