آموزش جامع تابع OBJECT_ID در SQL Server؛ از Syntax تا بهینهسازی
مقدمه و جایگاه تابع در SQL Server
تابع OBJECT_ID یکی از ابزارهای مهم متادیتا در Microsoft SQL Server است و برای یافتن شناسه داخلی یک شیء Schema-scoped بر پایه نام آن استفاده میشود. متادیتا دادهای درباره ساختار و وضعیت دادههاست؛ بنابراین پاسخ این تابع به محتوای رکوردهای تجاری وابسته نیست، بلکه به Context پایگاه داده، کاتالوگ سیستم، نوع ورودی و سطح دسترسی کاربر ارتباط دارد.
در پروژههای واقعی، OBJECT_ID در کنترل وجود جدول یا رویه، اتصال به نماهای sys، فیلتر وابستگیها و نگارش Migrationهای قابل تکرار به کار میرود. استفاده حرفهای فقط نوشتن یک SELECT کوتاه نیست؛ باید تفاوت مقدار معتبر، صفر و NULL، اثر Metadata Visibility، نامگذاری Schema-qualified و هزینه اجرای تکراری تابع را نیز شناخت.
این راهنما از مثال پایه آغاز میکند و تا سناریوهای ممیزی، گزارشگیری و بهینهسازی پیش میرود. برای مشاهده نقشه کامل این خانواده، راهنمای جامع توابع متادیتا در SQL Server را نیز مطالعه کنید.
تعریف، Syntax و قرارداد خروجی OBJECT_ID
OBJECT_ID به زبان ساده یافتن شناسه داخلی یک شیء Schema-scoped بر پایه نام آن را انجام میدهد. موتور SQL Server ورودی را در Context جاری تفسیر میکند و نتیجهای با نوع int برمیگرداند. اگر ورودی به شیء معتبر اشاره نکند، property پشتیبانی نشود یا کاربر اجازه دیدن متادیتا را نداشته باشد، نتیجه میتواند NULL باشد.
نحو استاندارد
SELECT OBJECT_ID ( object_name [ , object_type ] ) AS Result;
پارامترها
object_name نام شیء با قابلیت Schema-qualified و object_type کد اختیاری نوع مانند U برای جدول کاربر است.
نوع خروجی و معنای NULL
نوع اعلامشده خروجی int است. برنامه مصرفکننده باید NULL را یک حالت مستقل بداند و پیش از تبدیل نوع یا تصمیمگیری، علت آن را بررسی کند. نام بدون Schema میتواند مبهم باشد، Context پایگاه داده مهم است و نبود مجوز مشاهده متادیتا ممکن است خروجی NULL تولید کند.
| موضوع | توضیح فنی |
|---|
| کاربرد اصلی | یافتن شناسه داخلی یک شیء Schema-scoped بر پایه نام آن |
| نوع خروجی | int |
| Context | پایگاه داده یا نشست جاری، مطابق قرارداد تابع |
| حالت NULL | ورودی نامعتبر، نبود شیء یا نبود مجوز مشاهده متادیتا |
| کاربرد سازمانی | کنترل وجود جدول یا رویه، اتصال به نماهای sys، فیلتر وابستگیها و نگارش Migrationهای قابل تکرار |
اصل مهم: خروجی تابع OBJECT_ID را داده امنیتی قابل اعتماد فرض نکنید مگر اینکه مستندات همان property و مجوزهای Context این برداشت را تأیید کنند.
مثالهای عملی مستقل و قابل اجرا
مثال 1: شناسه یک جدول سیستمی
در این سناریو میخواهیم شناسه یک جدول سیستمی را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT OBJECT_ID(N'sys.objects', N'V') AS ObjectId;
| فیلد یا ستون | خروجی نمونه |
|---|
| ObjectId | 3 |
نکته کاربردی این مثال: عدد نمونه است و وابسته به نسخه و پایگاه داده خواهد بود. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 2: ایجاد جدول نمونه و دریافت شناسه
در این سناریو میخواهیم ایجاد جدول نمونه و دریافت شناسه را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
CREATE TABLE #DemoObject(Id int);
SELECT OBJECT_ID(N'tempdb..#DemoObject', N'U') AS ObjectId;
DROP TABLE #DemoObject;
| فیلد یا ستون | خروجی نمونه |
|---|
| ObjectId | -1123456789 |
نکته کاربردی این مثال: برای جدول موقت باید Context نام tempdb ذکر شود. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 3: نمایش نام و شناسه در SELECT
در این سناریو میخواهیم نمایش نام و شناسه در SELECT را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT o.name, OBJECT_ID(QUOTENAME(SCHEMA_NAME(o.schema_id)) + N'.' + QUOTENAME(o.name)) AS ResolvedId
FROM sys.objects AS o
WHERE o.name = N'tblNewsContent';
| فیلد یا ستون | خروجی نمونه |
|---|
| name | tblNewsContent |
| ResolvedId | 245575913 |
نکته کاربردی این مثال: نام Schema-qualified از ابهام جلوگیری میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 4: کنترل وجود پیش از عملیات
در این سناریو میخواهیم کنترل وجود پیش از عملیات را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
IF OBJECT_ID(N'dbo.tblNewsContent', N'U') IS NOT NULL
SELECT N'جدول موجود است' AS Status;
| فیلد یا ستون | خروجی نمونه |
|---|
| Status | جدول موجود است |
نکته کاربردی این مثال: کد نوع U مانع اشتباه گرفتن View همنام میشود. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 5: ترکیب با OBJECT_NAME
در این سناریو میخواهیم ترکیب با OBJECT_NAME را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @Id int = OBJECT_ID(N'dbo.tblNewsContent', N'U');
SELECT @Id AS ObjectId, OBJECT_NAME(@Id) AS ObjectName;
| فیلد یا ستون | خروجی نمونه |
|---|
| ObjectId | 245575913 |
| ObjectName | tblNewsContent |
نکته کاربردی این مثال: تبدیل رفتوبرگشتی برای گزارشهای متادیتا مفید است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 6: رفتار شیء ناموجود
در این سناریو میخواهیم رفتار شیء ناموجود را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT COALESCE(CONVERT(nvarchar(20), OBJECT_ID(N'dbo.NoSuchTable', N'U')), N'NULL') AS Result;
| فیلد یا ستون | خروجی نمونه |
|---|
| Result | NULL |
نکته کاربردی این مثال: NULL میتواند به معنی نبود شیء یا نبود مجوز مشاهده باشد. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 7: تفکیک نوع شیء
در این سناریو میخواهیم تفکیک نوع شیء را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT OBJECT_ID(N'sys.objects', N'U') AS AsTable,
OBJECT_ID(N'sys.objects', N'V') AS AsView;
| فیلد یا ستون | خروجی نمونه |
|---|
| AsTable | NULL |
| AsView | 3 |
نکته کاربردی این مثال: object_type اعتبار نوع مورد انتظار را نیز کنترل میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 8: گزارش ستونهای یک جدول
در این سناریو میخواهیم گزارش ستونهای یک جدول را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @ObjectId int = OBJECT_ID(N'dbo.tblNewsContent', N'U');
SELECT column_id, name, TYPE_NAME(user_type_id) AS TypeName
FROM sys.columns WHERE object_id = @ObjectId;
| فیلد یا ستون | خروجی نمونه |
|---|
| column_id | 1 |
| name | NewsID |
| TypeName | int |
نکته کاربردی این مثال: شناسه یکبار محاسبه و در کاتالوگ استفاده شده است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 9: روش اشتباه و نامگذاری صحیح
در این سناریو میخواهیم روش اشتباه و نامگذاری صحیح را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
-- مبهم: OBJECT_ID(N'Orders')
-- صحیح: نام دو بخشی و نوع مورد انتظار
SELECT OBJECT_ID(N'Sales.Orders', N'U') AS OrdersObjectId;
| فیلد یا ستون | خروجی نمونه |
|---|
| OrdersObjectId | 389576426 |
نکته کاربردی این مثال: Schema باید بخشی از قرارداد کد باشد. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 10: فیلتر SARGable با شناسه ثابت
در این سناریو میخواهیم فیلتر SARGable با شناسه ثابت را با تابع OBJECT_ID پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @ObjectId int = OBJECT_ID(N'dbo.tblNewsContent', N'U');
SELECT index_id, name
FROM sys.indexes
WHERE object_id = @ObjectId;
| فیلد یا ستون | خروجی نمونه |
|---|
| index_id | 1 |
| name | PK_tblNewsContent |
نکته کاربردی این مثال: فیلتر مستقیم روی object_id از محاسبات رشتهای مکرر بهتر است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
خطاهای رایج و روش عیبیابی
نخستین خطای رایج در OBJECT_ID اجرای Query در پایگاه داده نادرست است. قبل از تحلیل نتیجه، DB_NAME()، نام Schema و شناسه ورودی را ثبت کنید. اگر خروجی NULL است، جداگانه وجود شیء، صحت نام، نوع شیء و مجوز VIEW DEFINITION یا مجوز مرتبط را بررسی کنید.
خطای دوم، چسباندن خروجی تابع به SQL پویا بدون اعتبارسنجی است. نامی که قرار است بهعنوان Identifier استفاده شود باید از منبع مورد اعتماد بیاید و با QUOTENAME محصور شود؛ مقدارهای تجاری نیز باید با sp_executesql پارامتری شوند. نام بدون Schema میتواند مبهم باشد، Context پایگاه داده مهم است و نبود مجوز مشاهده متادیتا ممکن است خروجی NULL تولید کند.
- Context جاری را با SELECT DB_NAME() کنترل کنید.
- نامهای شیء را همراه Schema بنویسید و از حدس Schema پیشفرض دوری کنید.
- برای NULL پیام تشخیصی بسازید و آن را خودکار به صفر تبدیل نکنید.
- نتیجه را با نمای کاتالوگ مرتبط، مانند sys.objects، sys.columns یا sys.types، تطبیق دهید.
- مجوز مشاهده متادیتا را با کمترین سطح دسترسی لازم طراحی کنید.
ملاحظات کارایی و بهینهسازی Query
هزینه یک اجرای OBJECT_ID معمولاً در مقایسه با خواندن دادههای بزرگ ناچیز است، ولی قرار دادن آن روی هر ردیف یک 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;
هدف بهینهسازی حذف کورکورانه تابع نیست؛ هدف آن است که تابع در نقطهای اجرا شود که اطلاعات لازم را با کمترین تکرار و روشنترین قرارداد فراهم کند. تغییر باید با اندازهگیری قبل و بعد تأیید شود.
بهترین روشها و کاربرد در پروژه سازمانی
- نام پایگاه داده و Schema را بخشی از قرارداد اجرای اسکریپت بدانید.
- خروجی OBJECT_ID را بههمراه ورودی و Context در لاگ خطا ثبت کنید.
- برای Migration، شرط وجود را با نوع شیء مورد انتظار ترکیب کنید.
- در کد تولیدی، شاخه جداگانهای برای NULL و نبود مجوز در نظر بگیرید.
- برای گزارشهای انبوه، نماهای کاتالوگ را با نسخه تابعی Benchmark کنید.
- شناسههای داخلی را میان Development، Test و Production کپی نکنید.
- SQL پویا را با QUOTENAME و sp_executesql ایمن کنید.
- تست خودکار را پس از تغییر Schema و ارتقای نسخه SQL Server اجرا کنید.
یک کاربرد واقعی OBJECT_ID، ساخت ماژول Metadata-driven برای کنترل وجود جدول یا رویه، اتصال به نماهای sys، فیلتر وابستگیها و نگارش Migrationهای قابل تکرار است. چنین ماژولی باید خروجی نسخهبندیشده، کنترل مجوز، ثبت زمان اجرا و تست بازگشت داشته باشد. در پروژههای حساس، نتیجه با منبع دوم مانند نمای کاتالوگ تطبیق داده میشود تا تغییرات غیرمنتظره سریع شناسایی شوند.
سؤالات متداول اختصاصی
۱. تابع OBJECT_ID دقیقاً چه مسئلهای را حل میکند؟
OBJECT_ID برای یافتن شناسه داخلی یک شیء Schema-scoped بر پایه نام آن به کار میرود. مزیت آن این است که بهجای حدسزدن یا Hard-code کردن شناسهها و نامها، پاسخ را از متادیتای همان Context دریافت میکنیم. در یک سامانه حرفهای، خروجی باید همراه با کنترل NULL و ثبت Context مصرف شود تا نتیجه قابل اعتماد و قابل عیبیابی باشد.
۲. برای شروع استفاده از OBJECT_ID چه پیشنیازی لازم است؟
کاربر باید در پایگاه داده درست متصل باشد، ورودی معتبر بدهد و اجازه مشاهده متادیتای شیء هدف را داشته باشد. بهتر است ابتدا نمونه ساده مقاله اجرا شود و سپس Query با نامهای واقعی Schema و اشیای سازمان جایگزین گردد. برای رشتههای فارسی نیز پیشوند N باید حفظ شود.
۳. آیا آموزش و پیادهسازی سازمانی OBJECT_ID ارزش تجاری دارد؟
بله؛ استفاده صحیح از متادیتا زمان توسعه ابزارهای گزارشگیری، مهاجرت، ممیزی و نگهداری را کم میکند و خطای انسانی ناشی از مقادیر ثابت را کاهش میدهد. در دوره آموزشی یا مشاوره SQL Server میتوان این تابع را در قالب یک چارچوب Metadata-driven واقعی، همراه با تست و کنترل مجوزها، پیادهسازی کرد.
۴. OBJECT_ID چگونه هزینه پروژههای پایگاه داده را کاهش میدهد؟
وقتی قواعد کشف Schema یکبار و درست نوشته شوند، همان کد در چند محیط و چند نسخه پایگاه داده قابل استفاده است. این کار دوبارهکاری در Deployment و گزارشسازی را کم میکند. البته صرف استفاده از تابع کافی نیست و باید قرارداد نامگذاری، ثبت خطا و آزمون تغییرات نیز در پروژه تعریف شود.
۵. تفاوت استفاده از OBJECT_ID با خواندن مستقیم نماهای sys چیست؟
OBJECT_ID برای دریافت یک ویژگی یا تبدیل مشخص، کوتاه و خواناست؛ در مقابل، نماهای کاتالوگ sys برای گزارش انبوه، فیلتر چندویژگی و Joinهای تحلیلی انعطاف بیشتری دارند. انتخاب درست به حجم داده، نیاز به جزئیات و شکل Plan بستگی دارد و در بسیاری از ابزارها هر دو روش کنار هم استفاده میشوند.
۶. آیا میتوان برای طراحی ابزار یا گزارش اختصاصی OBJECT_ID مشاوره گرفت؟
بله؛ در یک خدمت تحلیل یا اجرای پروژه SQL Server ابتدا سناریو، مجوزها، نسخه موتور و اندازه کاتالوگ بررسی میشود. سپس Queryهای متادیتا با خروجی پایدار، لاگ خطا، تست خودکار و مستندات تحویل داده میشوند تا ابزار به یک نمونه نمایشی محدود نماند.
۷. رایجترین خطای OBJECT_ID چیست؟
رایجترین خطا تفسیر NULL بهعنوان پاسخ منفی قطعی است؛ درحالیکه NULL ممکن است از ورودی نامعتبر، Context اشتباه یا نبود مجوز مشاهده متادیتا ناشی شود. خطای دیگر استفاده از نام بدون Schema یا فرض ثابت بودن شناسهها میان پایگاههای داده است. نام بدون Schema میتواند مبهم باشد، Context پایگاه داده مهم است و نبود مجوز مشاهده متادیتا ممکن است خروجی NULL تولید کند.
۸. اجرای OBJECT_ID چه اثری بر Performance دارد؟
یک فراخوانی منفرد معمولاً بسیار سبک است، اما اجرای تابع برای هر ردیف یک مجموعه بزرگ یا در شرطی که Join مستقیم کاتالوگ مناسبتر است میتواند هزینه اضافی بسازد. مقدارهای ثابت را یکبار در متغیر محاسبه کنید، Actual Execution Plan و STATISTICS IO را بررسی کنید و برای گزارشهای انبوه از نماهای sys استفاده آگاهانه داشته باشید.
۹. Best Practice اصلی برای OBJECT_ID چیست؟
Context را صریح نگه دارید، نامها را Schema-qualified بنویسید، ورودی و خروجی NULL را کنترل کنید و شناسههای متادیتا را در محیط دیگر Hard-code نکنید. همچنین اگر خروجی وارد SQL پویا میشود، نام اشیا را با QUOTENAME محصور کنید و مقدارهای داده را پارامتری نگه دارید.
۱۰. OBJECT_ID با کدام نسخههای SQL Server سازگار است؟
این تابع از توابع جاافتاده Transact-SQL است، اما دامنه propertyها، مجوزهای لازم و سطح پشتیبانی در SQL Server، Azure SQL Database، Managed Instance و سرویسهای تحلیلی میتواند متفاوت باشد. پیش از استقرار، مستندات نسخه هدف و Compatibility Level را بررسی و Query را در محیط آزمایشی همان پلتفرم اجرا کنید.
سؤالات مصاحبه SQL Server
۱. چرا OBJECT_ID ممکن است NULL برگرداند؟
ورودی نامعتبر، Context نادرست، property ناسازگار یا محدودیت Metadata Visibility از علتهای اصلی هستند. پاسخ حرفهای باید روش تفکیک این علتها را نیز توضیح دهد.
۲. چه زمانی نمای sys را به OBJECT_ID ترجیح میدهید؟
وقتی چند ستون متادیتا برای مجموعه بزرگی از اشیا لازم است، Join و فیلتر مستقیم کاتالوگ معمولاً خواناتر و قابلبهینهسازیتر است. برای یک تبدیل یا ویژگی منفرد، تابع میتواند سادهتر باشد.
۳. چرا شناسههای متادیتا نباید Hard-code شوند؟
زیرا شناسهها در پایگاه دیگر، پس از بازسازی شیء یا در محیط استقرار متفاوت میتوانند تغییر کنند. نام معتبر یا کاتالوگ باید در زمان اجرا شناسه را حل کند.
۴. Metadata Visibility چه اثری بر نتیجه دارد؟
کاربر معمولاً فقط متادیتای Securableهایی را میبیند که مالک آنهاست یا مجوز مرتبط دارد. بنابراین NULL الزاماً نبود شیء را ثابت نمیکند.
۵. چگونه کارایی Query متادیتا را میسنجید؟
نسخهها را با IO، TIME، Plan واقعی، تعداد ردیف و مجوز یکسان مقایسه میکنم و تکرار تابع، Predicate و Joinهای کاتالوگ را بررسی میکنم.
چکلیست نهایی
- Syntax تابع OBJECT_ID با نوع ورودی صحیح نوشته شده است.
- Context پایگاه داده و Schema پیش از اجرا کنترل شدهاند.
- NULL، صفر و یک بر اساس قرارداد property از هم تفکیک شدهاند.
- هیچ شناسه داخلی بین محیطها Hard-code نشده است.
- نامهای واردشده به SQL پویا با QUOTENAME ایمن شدهاند.
- نسخه کاتالوگی برای گزارشهای انبوه بررسی و Benchmark شده است.
- مجوز مشاهده متادیتا با اصل حداقل دسترسی تنظیم شده است.
- تست پس از تغییر Schema و ارتقای SQL Server وجود دارد.
جمعبندی
OBJECT_ID ابزاری دقیق برای یافتن شناسه داخلی یک شیء Schema-scoped بر پایه نام آن است، به شرط آنکه Context، مجوز و معنای NULL جدی گرفته شود. مثالهای این مقاله نشان دادند چگونه از Query ساده به ممیزی سازمانی، مدیریت خطا و انتخاب روش کاراتر برسیم.
برای مقایسه این تابع با سایر اعضای خانواده و دسترسی به مقالههای مرتبط، به مقاله مادر توابع Metadata در SQL Server بازگردید. در پیادهسازی نهایی، مستندات نسخه هدف و Plan واقعی Query مرجع تصمیم باشند.