آموزش جامع تابع TYPE_NAME در SQL Server؛ از Syntax تا بهینهسازی
مقدمه و جایگاه تابع در SQL Server
تابع TYPE_NAME یکی از ابزارهای مهم متادیتا در Microsoft SQL Server است و برای تبدیل شناسه نوع داده به نام قابل خواندن آن استفاده میشود. متادیتا دادهای درباره ساختار و وضعیت دادههاست؛ بنابراین پاسخ این تابع به محتوای رکوردهای تجاری وابسته نیست، بلکه به Context پایگاه داده، کاتالوگ سیستم، نوع ورودی و سطح دسترسی کاربر ارتباط دارد.
در پروژههای واقعی، TYPE_NAME در Data Dictionary، تولید DDL، نمایش نوع ستونها و پارامترها، مقایسه Schema و ابزارهای مهاجرت به کار میرود. استفاده حرفهای فقط نوشتن یک SELECT کوتاه نیست؛ باید تفاوت مقدار معتبر، صفر و NULL، اثر Metadata Visibility، نامگذاری Schema-qualified و هزینه اجرای تکراری تابع را نیز شناخت.
این راهنما از مثال پایه آغاز میکند و تا سناریوهای ممیزی، گزارشگیری و بهینهسازی پیش میرود. برای مشاهده نقشه کامل این خانواده، راهنمای جامع توابع متادیتا در SQL Server را نیز مطالعه کنید.
تعریف، Syntax و قرارداد خروجی TYPE_NAME
TYPE_NAME به زبان ساده تبدیل شناسه نوع داده به نام قابل خواندن آن را انجام میدهد. موتور SQL Server ورودی را در Context جاری تفسیر میکند و نتیجهای با نوع nvarchar(128) برمیگرداند. اگر ورودی به شیء معتبر اشاره نکند، property پشتیبانی نشود یا کاربر اجازه دیدن متادیتا را نداشته باشد، نتیجه میتواند NULL باشد.
نحو استاندارد
SELECT TYPE_NAME ( type_id ) AS Result;
پارامترها
type_id شناسه نوع داده در پایگاه داده جاری است و میتواند user_type_id یک نوع سیستمی یا Alias Type باشد.
نوع خروجی و معنای NULL
نوع اعلامشده خروجی nvarchar(128) است. برنامه مصرفکننده باید NULL را یک حالت مستقل بداند و پیش از تبدیل نوع یا تصمیمگیری، علت آن را بررسی کند. Context پایگاه داده و Metadata Visibility مهم است؛ برای تمایز نوع کاربر و نوع پایه باید sys.types و system_type_id نیز بررسی شود.
| موضوع | توضیح فنی |
|---|
| کاربرد اصلی | تبدیل شناسه نوع داده به نام قابل خواندن آن |
| نوع خروجی | nvarchar(128) |
| Context | پایگاه داده یا نشست جاری، مطابق قرارداد تابع |
| حالت NULL | ورودی نامعتبر، نبود شیء یا نبود مجوز مشاهده متادیتا |
| کاربرد سازمانی | Data Dictionary، تولید DDL، نمایش نوع ستونها و پارامترها، مقایسه Schema و ابزارهای مهاجرت |
اصل مهم: خروجی تابع TYPE_NAME را داده امنیتی قابل اعتماد فرض نکنید مگر اینکه مستندات همان property و مجوزهای Context این برداشت را تأیید کنند.
مثالهای عملی مستقل و قابل اجرا
مثال 1: نام نوع int
در این سناریو میخواهیم نام نوع int را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT TYPE_NAME(TYPE_ID(N'int')) AS TypeName;
| فیلد یا ستون | خروجی نمونه |
|---|
| TypeName | int |
نکته کاربردی این مثال: رفتوبرگشت نوع سیستمی ساده است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 2: نمایش انواع ستونهای جدول
در این سناریو میخواهیم نمایش انواع ستونهای جدول را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT c.name AS ColumnName, TYPE_NAME(c.user_type_id) AS TypeName
FROM sys.columns AS c
WHERE c.object_id=OBJECT_ID(N'dbo.tblNewsContent');
| فیلد یا ستون | خروجی نمونه |
|---|
| ColumnName | NewsID |
| TypeName | int |
نکته کاربردی این مثال: user_type_id نام Alias Type را نیز حفظ میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 3: جدول نمونه با چند نوع
در این سناریو میخواهیم جدول نمونه با چند نوع را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
USE tempdb;
CREATE TABLE #TypeNames(Id bigint, Title nvarchar(50), CreatedAt datetime2);
SELECT name, TYPE_NAME(user_type_id) AS TypeName
FROM tempdb.sys.columns WHERE object_id=OBJECT_ID(N'tempdb..#TypeNames');
DROP TABLE #TypeNames;
USE [a00b];
| فیلد یا ستون | خروجی نمونه |
|---|
| name | Id / Title / CreatedAt |
| TypeName | bigint / nvarchar / datetime2 |
نکته کاربردی این مثال: مثال در tempdb اجرا و Context در پایان بازیابی میشود. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 4: فیلتر ستونهای نوع متنی
در این سناریو میخواهیم فیلتر ستونهای نوع متنی را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT c.name
FROM sys.columns AS c
WHERE c.object_id=OBJECT_ID(N'dbo.tblNewsContent')
AND TYPE_NAME(c.user_type_id) IN (N'nvarchar',N'nchar',N'ntext');
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsTitle / NewsContent / ... |
نکته کاربردی این مثال: برای تحلیل کامل length و collation نیز لازم است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 5: ترکیب با TYPE_ID
در این سناریو میخواهیم ترکیب با TYPE_ID را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @Type sysname=N'nvarchar';
SELECT TYPE_NAME(TYPE_ID(@Type)) AS ValidatedTypeName;
| فیلد یا ستون | خروجی نمونه |
|---|
| ValidatedTypeName | nvarchar |
نکته کاربردی این مثال: وجود نوع در Context جاری کنترل میشود. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 6: شناسه نوع نامعتبر
در این سناریو میخواهیم شناسه نوع نامعتبر را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT COALESCE(TYPE_NAME(2147483647),N'نوع ناشناخته') AS SafeTypeName;
| فیلد یا ستون | خروجی نمونه |
|---|
| SafeTypeName | نوع ناشناخته |
نکته کاربردی این مثال: NULL میتواند ناشی از نبود نوع یا مجوز باشد. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 7: نوع کاربر و نوع پایه
در این سناریو میخواهیم نوع کاربر و نوع پایه را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT TOP (5) t.user_type_id,t.name AS UserTypeName,TYPE_NAME(t.system_type_id) AS SystemTypeName
FROM sys.types AS t WHERE t.is_user_defined=1;
| فیلد یا ستون | خروجی نمونه |
|---|
| UserTypeName | PhoneNumber |
| SystemTypeName | nvarchar |
نکته کاربردی این مثال: Alias Type قرارداد دامنه را روی نوع پایه سوار میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 8: ساخت Data Dictionary کاربردی
در این سناریو میخواهیم ساخت Data Dictionary کاربردی را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT c.column_id,c.name,TYPE_NAME(c.user_type_id) AS TypeName,c.max_length,c.is_nullable
FROM sys.columns AS c
WHERE c.object_id=OBJECT_ID(N'dbo.tblNewsContent')
ORDER BY c.column_id;
| فیلد یا ستون | خروجی نمونه |
|---|
| name | NewsTitle |
| TypeName | nvarchar |
| max_length | 400 |
| is_nullable | 0 |
نکته کاربردی این مثال: max_length برای Unicode برحسب بایت است. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 9: روش اشتباه در تولید DDL
در این سناریو میخواهیم روش اشتباه در تولید DDL را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
DECLARE @TypeName sysname=TYPE_NAME(TYPE_ID(N'nvarchar'));
SELECT QUOTENAME(@TypeName) AS QuotedTypeName;
| فیلد یا ستون | خروجی نمونه |
|---|
| QuotedTypeName | [nvarchar] |
نکته کاربردی این مثال: نام نوع را اعتبارسنجی و برای شناسه SQL محصور کنید؛ طول و دقت را جدا بسازید. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
مثال 10: Join مستقیم برای گزارش انبوه
در این سناریو میخواهیم Join مستقیم برای گزارش انبوه را با تابع TYPE_NAME پیادهسازی کنیم. Query زیر مستقل طراحی شده است؛ اگر به جدول پروژه اشاره دارد، نام Schema و شیء را با ساختار واقعی محیط خود هماهنگ کنید و پیش از اجرای عملیاتی سطح دسترسی را کنترل نمایید.
SELECT c.name AS ColumnName,t.name AS TypeName
FROM sys.columns AS c
JOIN sys.types AS t ON t.user_type_id=c.user_type_id
WHERE c.object_id=OBJECT_ID(N'dbo.tblNewsContent');
| فیلد یا ستون | خروجی نمونه |
|---|
| ColumnName | NewsID |
| TypeName | int |
نکته کاربردی این مثال: Join به sys.types امکان فیلتر روی ویژگیهای نوع را فراهم میکند. نتیجه نمایشدادهشده نمونه است و شناسهها، نامها یا اندازهها ممکن است در سرور شما متفاوت باشند؛ معیار صحت، منطق Query و متادیتای واقعی محیط است.
خطاهای رایج و روش عیبیابی
نخستین خطای رایج در TYPE_NAME اجرای Query در پایگاه داده نادرست است. قبل از تحلیل نتیجه، DB_NAME()، نام Schema و شناسه ورودی را ثبت کنید. اگر خروجی NULL است، جداگانه وجود شیء، صحت نام، نوع شیء و مجوز VIEW DEFINITION یا مجوز مرتبط را بررسی کنید.
خطای دوم، چسباندن خروجی تابع به SQL پویا بدون اعتبارسنجی است. نامی که قرار است بهعنوان Identifier استفاده شود باید از منبع مورد اعتماد بیاید و با QUOTENAME محصور شود؛ مقدارهای تجاری نیز باید با sp_executesql پارامتری شوند. Context پایگاه داده و Metadata Visibility مهم است؛ برای تمایز نوع کاربر و نوع پایه باید sys.types و system_type_id نیز بررسی شود.
- Context جاری را با SELECT DB_NAME() کنترل کنید.
- نامهای شیء را همراه Schema بنویسید و از حدس Schema پیشفرض دوری کنید.
- برای NULL پیام تشخیصی بسازید و آن را خودکار به صفر تبدیل نکنید.
- نتیجه را با نمای کاتالوگ مرتبط، مانند sys.objects، sys.columns یا sys.types، تطبیق دهید.
- مجوز مشاهده متادیتا را با کمترین سطح دسترسی لازم طراحی کنید.
ملاحظات کارایی و بهینهسازی Query
هزینه یک اجرای TYPE_NAME معمولاً در مقایسه با خواندن دادههای بزرگ ناچیز است، ولی قرار دادن آن روی هر ردیف یک 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 را بخشی از قرارداد اجرای اسکریپت بدانید.
- خروجی TYPE_NAME را بههمراه ورودی و Context در لاگ خطا ثبت کنید.
- برای Migration، شرط وجود را با نوع شیء مورد انتظار ترکیب کنید.
- در کد تولیدی، شاخه جداگانهای برای NULL و نبود مجوز در نظر بگیرید.
- برای گزارشهای انبوه، نماهای کاتالوگ را با نسخه تابعی Benchmark کنید.
- شناسههای داخلی را میان Development، Test و Production کپی نکنید.
- SQL پویا را با QUOTENAME و sp_executesql ایمن کنید.
- تست خودکار را پس از تغییر Schema و ارتقای نسخه SQL Server اجرا کنید.
یک کاربرد واقعی TYPE_NAME، ساخت ماژول Metadata-driven برای Data Dictionary، تولید DDL، نمایش نوع ستونها و پارامترها، مقایسه Schema و ابزارهای مهاجرت است. چنین ماژولی باید خروجی نسخهبندیشده، کنترل مجوز، ثبت زمان اجرا و تست بازگشت داشته باشد. در پروژههای حساس، نتیجه با منبع دوم مانند نمای کاتالوگ تطبیق داده میشود تا تغییرات غیرمنتظره سریع شناسایی شوند.
سؤالات متداول اختصاصی
۱. تابع TYPE_NAME دقیقاً چه مسئلهای را حل میکند؟
TYPE_NAME برای تبدیل شناسه نوع داده به نام قابل خواندن آن به کار میرود. مزیت آن این است که بهجای حدسزدن یا Hard-code کردن شناسهها و نامها، پاسخ را از متادیتای همان Context دریافت میکنیم. در یک سامانه حرفهای، خروجی باید همراه با کنترل NULL و ثبت Context مصرف شود تا نتیجه قابل اعتماد و قابل عیبیابی باشد.
۲. برای شروع استفاده از TYPE_NAME چه پیشنیازی لازم است؟
کاربر باید در پایگاه داده درست متصل باشد، ورودی معتبر بدهد و اجازه مشاهده متادیتای شیء هدف را داشته باشد. بهتر است ابتدا نمونه ساده مقاله اجرا شود و سپس Query با نامهای واقعی Schema و اشیای سازمان جایگزین گردد. برای رشتههای فارسی نیز پیشوند N باید حفظ شود.
۳. آیا آموزش و پیادهسازی سازمانی TYPE_NAME ارزش تجاری دارد؟
بله؛ استفاده صحیح از متادیتا زمان توسعه ابزارهای گزارشگیری، مهاجرت، ممیزی و نگهداری را کم میکند و خطای انسانی ناشی از مقادیر ثابت را کاهش میدهد. در دوره آموزشی یا مشاوره SQL Server میتوان این تابع را در قالب یک چارچوب Metadata-driven واقعی، همراه با تست و کنترل مجوزها، پیادهسازی کرد.
۴. TYPE_NAME چگونه هزینه پروژههای پایگاه داده را کاهش میدهد؟
وقتی قواعد کشف Schema یکبار و درست نوشته شوند، همان کد در چند محیط و چند نسخه پایگاه داده قابل استفاده است. این کار دوبارهکاری در Deployment و گزارشسازی را کم میکند. البته صرف استفاده از تابع کافی نیست و باید قرارداد نامگذاری، ثبت خطا و آزمون تغییرات نیز در پروژه تعریف شود.
۵. تفاوت استفاده از TYPE_NAME با خواندن مستقیم نماهای sys چیست؟
TYPE_NAME برای دریافت یک ویژگی یا تبدیل مشخص، کوتاه و خواناست؛ در مقابل، نماهای کاتالوگ sys برای گزارش انبوه، فیلتر چندویژگی و Joinهای تحلیلی انعطاف بیشتری دارند. انتخاب درست به حجم داده، نیاز به جزئیات و شکل Plan بستگی دارد و در بسیاری از ابزارها هر دو روش کنار هم استفاده میشوند.
۶. آیا میتوان برای طراحی ابزار یا گزارش اختصاصی TYPE_NAME مشاوره گرفت؟
بله؛ در یک خدمت تحلیل یا اجرای پروژه SQL Server ابتدا سناریو، مجوزها، نسخه موتور و اندازه کاتالوگ بررسی میشود. سپس Queryهای متادیتا با خروجی پایدار، لاگ خطا، تست خودکار و مستندات تحویل داده میشوند تا ابزار به یک نمونه نمایشی محدود نماند.
۷. رایجترین خطای TYPE_NAME چیست؟
رایجترین خطا تفسیر NULL بهعنوان پاسخ منفی قطعی است؛ درحالیکه NULL ممکن است از ورودی نامعتبر، Context اشتباه یا نبود مجوز مشاهده متادیتا ناشی شود. خطای دیگر استفاده از نام بدون Schema یا فرض ثابت بودن شناسهها میان پایگاههای داده است. Context پایگاه داده و Metadata Visibility مهم است؛ برای تمایز نوع کاربر و نوع پایه باید sys.types و system_type_id نیز بررسی شود.
۸. اجرای TYPE_NAME چه اثری بر Performance دارد؟
یک فراخوانی منفرد معمولاً بسیار سبک است، اما اجرای تابع برای هر ردیف یک مجموعه بزرگ یا در شرطی که Join مستقیم کاتالوگ مناسبتر است میتواند هزینه اضافی بسازد. مقدارهای ثابت را یکبار در متغیر محاسبه کنید، Actual Execution Plan و STATISTICS IO را بررسی کنید و برای گزارشهای انبوه از نماهای sys استفاده آگاهانه داشته باشید.
۹. Best Practice اصلی برای TYPE_NAME چیست؟
Context را صریح نگه دارید، نامها را Schema-qualified بنویسید، ورودی و خروجی NULL را کنترل کنید و شناسههای متادیتا را در محیط دیگر Hard-code نکنید. همچنین اگر خروجی وارد SQL پویا میشود، نام اشیا را با QUOTENAME محصور کنید و مقدارهای داده را پارامتری نگه دارید.
۱۰. TYPE_NAME با کدام نسخههای SQL Server سازگار است؟
این تابع از توابع جاافتاده Transact-SQL است، اما دامنه propertyها، مجوزهای لازم و سطح پشتیبانی در SQL Server، Azure SQL Database، Managed Instance و سرویسهای تحلیلی میتواند متفاوت باشد. پیش از استقرار، مستندات نسخه هدف و Compatibility Level را بررسی و Query را در محیط آزمایشی همان پلتفرم اجرا کنید.
سؤالات مصاحبه SQL Server
۱. چرا TYPE_NAME ممکن است NULL برگرداند؟
ورودی نامعتبر، Context نادرست، property ناسازگار یا محدودیت Metadata Visibility از علتهای اصلی هستند. پاسخ حرفهای باید روش تفکیک این علتها را نیز توضیح دهد.
۲. چه زمانی نمای sys را به TYPE_NAME ترجیح میدهید؟
وقتی چند ستون متادیتا برای مجموعه بزرگی از اشیا لازم است، Join و فیلتر مستقیم کاتالوگ معمولاً خواناتر و قابلبهینهسازیتر است. برای یک تبدیل یا ویژگی منفرد، تابع میتواند سادهتر باشد.
۳. چرا شناسههای متادیتا نباید Hard-code شوند؟
زیرا شناسهها در پایگاه دیگر، پس از بازسازی شیء یا در محیط استقرار متفاوت میتوانند تغییر کنند. نام معتبر یا کاتالوگ باید در زمان اجرا شناسه را حل کند.
۴. Metadata Visibility چه اثری بر نتیجه دارد؟
کاربر معمولاً فقط متادیتای Securableهایی را میبیند که مالک آنهاست یا مجوز مرتبط دارد. بنابراین NULL الزاماً نبود شیء را ثابت نمیکند.
۵. چگونه کارایی Query متادیتا را میسنجید؟
نسخهها را با IO، TIME، Plan واقعی، تعداد ردیف و مجوز یکسان مقایسه میکنم و تکرار تابع، Predicate و Joinهای کاتالوگ را بررسی میکنم.
چکلیست نهایی
- Syntax تابع TYPE_NAME با نوع ورودی صحیح نوشته شده است.
- Context پایگاه داده و Schema پیش از اجرا کنترل شدهاند.
- NULL، صفر و یک بر اساس قرارداد property از هم تفکیک شدهاند.
- هیچ شناسه داخلی بین محیطها Hard-code نشده است.
- نامهای واردشده به SQL پویا با QUOTENAME ایمن شدهاند.
- نسخه کاتالوگی برای گزارشهای انبوه بررسی و Benchmark شده است.
- مجوز مشاهده متادیتا با اصل حداقل دسترسی تنظیم شده است.
- تست پس از تغییر Schema و ارتقای SQL Server وجود دارد.
جمعبندی
TYPE_NAME ابزاری دقیق برای تبدیل شناسه نوع داده به نام قابل خواندن آن است، به شرط آنکه Context، مجوز و معنای NULL جدی گرفته شود. مثالهای این مقاله نشان دادند چگونه از Query ساده به ممیزی سازمانی، مدیریت خطا و انتخاب روش کاراتر برسیم.
برای مقایسه این تابع با سایر اعضای خانواده و دسترسی به مقالههای مرتبط، به مقاله مادر توابع Metadata در SQL Server بازگردید. در پیادهسازی نهایی، مستندات نسخه هدف و Plan واقعی Query مرجع تصمیم باشند.