سلام دوستان عزیز
🔍 SET FMTONLY دقیقاً چیه و چرا دیگه بهتره ازش استفاده نکنیم؟
یه نکته فنی که این چند روز دوباره باهاش برخورد کردم و گفتم اینجا هم بگم:
SET FMTONLY ON
خیلیها هنوز توی پروژهها استفاده میکنن، در حالی که واقعاً دیگه وقتشه بذاریمش کنار 😄
🧪 SET FMTONLY ON یعنی چی؟
وقتی این گزینه رو فعال میکنی:
SET FMTONLY ON;
SELECT * FROM Sales.Orders;
SQL Server اصلاً کوئری رو اجرا نمیکنه!
فقط ساختار خروجی رو میده:
- اسم ستونها
- نوع دادهها
- نه دیتا میخونه
- نه لاجیک اجرا میکنه
- نه Temp Table میسازه
- نه حتی Cross DB Query اجرا میشه!
برای همون دوران ADO و ODBC قدیم ساخته شده بود.
❌ مشکلش چیه؟
FMTONLY از SQL 2012 به بعد رسماً منقرض شده (Deprecated) چون:
- با Temp Table و Table Variable قاطی میکنه
- خیلی وقتها خطای Invalid object name میده
- خروجی DMVها نصفهنیمه برمیگردونه
- روی نسخههای مختلف SQL Server متفاوت رفتار میکنه
دقیقاً همون چیزیه که تو ابزارهای مانیتورینگ یا ORMها باعث Errorهای عجیب میشه.
✔️ جایگزین استاندارد و مدرن
بهجاش از این DMV فوقالعاده استفاده کنید:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'SELECT CustomerId, TotalPrice FROM Sales.Orders',
NULL,
NULL
);
این کارها رو انجام میده:
✔️ کوئری رو اجرا نمیکنه
✔️ ساختار دقیق نتیجه رو برمیگردونه
✔️ با نسخههای مختلف SQL Server سازگاره
✔️ با Temp Table و Dynamic SQL هم درست کار میکنه
🔥 مثال عملیِ واقعی
فرض کن یک Stored Procedure داری:
CREATE PROCEDURE dbo.UspGetOrders
AS
BEGIN
SELECT TOP 100 OrderId, CustomerId, TotalAmount
FROM Sales.Orders
ORDER BY OrderDate DESC;
END
میخوای فقط ساختار خروجی رو ببینی، بدون اینکه SP رو واقعاً اجرا کنی:
SELECT *
FROM sys.dm_exec_describe_first_result_set
(
N'EXEC dbo.UspGetOrders',
NULL,
NULL
);
که میاد ساختار جداول و فیلدها رو بهتون ارائه میده.
شما تاحالا ازش استفاده کردین؟