راهنمای جامع DECLARE VARIABLE در SQL Server: از سینتکس تا کاربرد
در کار با SQL Server، متغیرها (VARIABLE) نقشی حیاتی در ذخیره و دستکاری دادهها درون اسکریپتهای T-SQL شما ایفا میکنند. آنها راهی انعطافپذیر برای نگهداری موقت مقادیر فراهم میآورند که میتوانند در بخشهای مختلف کوئریها، رویههای ذخیرهشده یا توابع شما مورد استفاده قرار گیرند. درک صحیح نحوه اعلان و استفاده از متغیرها، برای نوشتن کدهای SQL کارآمد و پویا اساسی است. این مقاله به دستور `DECLARE` میپردازد و سینتکس آن، موارد استفاده رایج و بهترین شیوهها را با مثالهای عملی پوشش میدهد. دستور `DECLARE` برای اعلان یک متغیر در SQL Server استفاده میشود. سینتکس پایه آن ساده است:
DECLARE @variable_name data_type [ = initial_value ] [ , @variable_name data_type [ = initial_value ] ] ... ;
در اینجا، `@variable_name` نام متغیر شماست که همیشه با علامت `@` شروع میشود. `data_type` نوع دادهای است که متغیر شما ذخیره خواهد کرد (مانند `INT`, `VARCHAR`, `DATE` و غیره). بخش `[ = initial_value ]` اختیاری است و به شما امکان میدهد یک مقدار اولیه به متغیر اختصاص دهید.
مثال: اعلان یک متغیر تکی
بیایید با یک مثال ساده از اعلان یک متغیر صحیح (integer) تکی شروع کنیم. در این مثال، یک متغیر از نوع `INT` به نام `@myNumber` را اعلان میکنیم و سپس یک مقدار به آن اختصاص میدهیم و آن را انتخاب میکنیم.
DECLARE @myNumber INT;
SET @myNumber = 100;
SELECT @myNumber AS MyDeclaredNumber;
این کد یک متغیر `INT` به نام `@myNumber` را اعلان میکند، مقدار 100 را به آن اختصاص میدهد و سپس مقدار آن را با نام مستعار `MyDeclaredNumber` نمایش میدهد.
مثال: اعلان چند متغیر
شما میتوانید چندین متغیر را در یک دستور `DECLARE` با جدا کردن آنها با کاما اعلان کنید. برای اعلان چندین متغیر به صورت همزمان، کافیست آنها را با کاما جدا کنید.
DECLARE @firstName VARCHAR(50),
@lastName VARCHAR(50),
@age INT;
SET @firstName = 'John';
SET @lastName = 'Doe';
SET @age = 30;
SELECT @firstName AS FirstName, @lastName AS LastName, @age AS Age;
این بلوک کد سه متغیر `@firstName` (از نوع `VARCHAR`)، `@lastName` (از نوع `VARCHAR`) و `@age` (از نوع `INT`) را اعلان میکند، مقادیر مربوطه را به آنها اختصاص میدهد و سپس هر سه را در یک نتیجه نمایش میدهد.
مثال: مقداردهی اولیه متغیرها در زمان اعلان
میتوانید در زمان اعلان، یک مقدار اولیه به متغیر اختصاص دهید. این قابلیت به شما کمک میکند تا کد کوتاهتر و خواناتری داشته باشید.
DECLARE @productName VARCHAR(100) = 'Laptop';
DECLARE @price DECIMAL(10, 2) = 1200.50;
DECLARE @orderDate DATE = GETDATE();
SELECT @productName AS ProductName, @price AS Price, @orderDate AS OrderDate;
در این مثال، سه متغیر `@productName`، `@price` و `@orderDate` در زمان اعلان با مقادیر اولیه خود مقداردهی شدهاند و سپس مقادیر آنها نمایش داده میشود.
انتساب مقادیر با استفاده از SET و SELECT
پس از اعلان یک متغیر، میتوانید با استفاده از دستور `SET` یا دستور `SELECT`، مقادیر جدیدی به آن اختصاص دهید یا مقادیر موجود را بازنویسی کنید.
با `SET` (توصیه شده):
DECLARE @counter INT;
SET @counter = 0;
SET @counter = @counter + 1;
SELECT @counter AS CurrentCounter;
دستور `SET` روش ترجیحی و استاندارد برای انتساب یک مقدار تکی به یک متغیر است.
با `SELECT`:
DECLARE @totalSales DECIMAL(18, 2);
SELECT @totalSales = SUM(OrderTotal) FROM Sales.Orders WHERE OrderDate >= '2023-01-01';
SELECT @totalSales AS TotalSalesForYear;
دستور `SELECT` میتواند برای انتساب یک مقدار به متغیر استفاده شود، به خصوص زمانی که مقدار از یک کوئری بازگردانده میشود. اگر کوئری `SELECT` چندین ردیف را بازگرداند، متغیر مقدار را از آخرین ردیف دریافت خواهد کرد. اگر هیچ ردیفی بازگردانده نشود، متغیر `NULL` باقی میماند (یا اگر مقدار اولیه برای آن تنظیم شده بود، همان مقدار اولیه را حفظ میکند).
محدوده (Scope) متغیرها
متغیرهایی که در یک بچ (batch) T-SQL اعلان میشوند، محلی (local) برای همان بچ هستند. این بدان معناست که آنها نمیتوانند خارج از بچی که در آن اعلان شدهاند، دسترسی پیدا کنند. این مفهوم برای مدیریت حافظه و جلوگیری از تداخل نامها مهم است.
DECLARE @batchVar INT = 1;
PRINT @batchVar;
GO
-- This will cause an error because @batchVar is out of scope
-- SELECT @batchVar;
در این مثال، متغیر `@batchVar` در بچ اول اعلان و استفاده میشود. دستور `GO` پایان بچ اول و شروع بچ جدید را نشان میدهد. تلاش برای دسترسی به `@batchVar` در بچ دوم منجر به خطا میشود، زیرا متغیر از محدوده خارج شده است.
متغیرهای جدولی (Table Variables)
علاوه بر متغیرهای اسکالر (که یک مقدار تکی را نگه میدارند)، SQL Server از متغیرهای جدولی نیز پشتیبانی میکند. اینها انواع خاصی از متغیرهای محلی هستند که میتوانند مجموعهای از نتایج را ذخیره کنند، مشابه جداول موقت (temporary tables) اما با تفاوتهای کلیدی در محدوده و رفتار تراکنشها. سینتکس برای اعلان یک متغیر جدولی:
DECLARE @tableName TABLE ( column1 dataType [NULL | NOT NULL], column2 dataType [NULL | NOT NULL], ... );
در این سینتکس، `@tableName` نام متغیر جدولی و `(column1 dataType …)` تعریف ساختار ستونهای جدول را نشان میدهد، دقیقاً مانند تعریف یک جدول معمولی.
مثال: استفاده از متغیر جدولی
در این مثال، یک متغیر جدولی به نام `@tempProducts` ایجاد میکنیم، دادههایی را در آن درج میکنیم و سپس یک کوئری روی آن اجرا میکنیم.
DECLARE @tempProducts TABLE (
ProductID INT PRIMARY KEY,
ProductName VARCHAR(100),
Price DECIMAL(10, 2)
);
INSERT INTO @tempProducts (ProductID, ProductName, Price)
VALUES (1, 'Laptop', 1200.50),
(2, 'Mouse', 25.00),
(3, 'Keyboard', 75.20);
SELECT * FROM @tempProducts WHERE Price > 50;
این کد یک متغیر جدولی برای ذخیره اطلاعات محصولات ایجاد میکند، سه محصول را در آن درج میکند و سپس محصولاتی را که قیمت آنها بیش از 50 است، از آن متغیر جدولی انتخاب میکند.
بهترین شیوهها و نکات
برای نوشتن کد SQL کارآمد و قابل نگهداری، رعایت این نکات کلیدی ضروری است:
- همیشه متغیرها را با انواع داده مناسب اعلان کنید تا از تبدیلهای ضمنی و خطاهای احتمالی جلوگیری شود.
- متغیرها را مقداردهی اولیه (initialize) کنید تا از مقادیر `NULL` غیرمنتظره یا دادههای قدیمی جلوگیری شود.
- از نامهای معنیدار برای متغیرها استفاده کنید (به عنوان مثال، `@totalAmount` به جای `@t`).
- برای انتساب یک مقدار اسکالر تکی، `SET` به طور کلی بر `SELECT` ترجیح داده میشود، زیرا `SET` استاندارد ANSI بوده و قابل پیشبینیتر است.
- به محدوده متغیر (variable scope) توجه داشته باشید تا از خطاها جلوگیری کرده و جریان داده صحیح را تضمین کنید.
- برای مجموعه دادههای بزرگ یا عملیات پیچیده که به ایندکس نیاز دارند، جداول موقت (`#tempTable`) ممکن است انتخاب بهتری نسبت به متغیرهای جدولی باشند که عمدتاً در حافظه مقیم هستند.
نتیجهگیری
متغیرها ابزاری ضروری در برنامهنویسی T-SQL هستند که شما را قادر میسازند اسکریپتهای SQL انعطافپذیرتر، قابل استفاده مجدد و کارآمدتر بنویسید. با تسلط بر دستور `DECLARE` و درک ظرایف استفاده از متغیرها، میتوانید قابلیتهای توسعه SQL Server خود را به طور قابل توجهی افزایش دهید. با این مثالها آزمایش کنید و متغیرها را در اسکریپتهای خود ادغام کنید تا قدرت کامل آنها را ببینید.