متغیرهای SQL در T-SQL: راهنمای جامع برای توسعه و اسکریپتنویسی
متغیرهای SQL نقش حیاتی در ساخت اسکریپتها، کوئریها، روالهای ذخیرهشده (Stored Procedures)، توابع و تریگرهای انعطافپذیر و پویا در SQL Server ایفا میکنند. این عناصر قدرتمند به شما امکان میدهند مقادیر را به صورت موقت ذخیره کرده و در طول اجرای کدهای T-SQL خود از آنها استفاده کنید. این قابلیت به بهینهسازی، خوانایی و قابلیت نگهداری کد کمک شایانی میکند و برای هر توسعهدهنده پایگاه دادهای ضروری است.
در T-SQL، قبل از استفاده از متغیرها، باید آنها را تعریف (DECLARE) کنید. این کار شامل تعیین نام متغیر و نوع دادهای است که قرار است نگهداری کند. نام تمامی متغیرهای محلی در SQL Server باید با کاراکتر @ شروع شود تا از سایر اشیاء پایگاه داده متمایز شوند. شما میتوانید یک متغیر را بدون مقدار اولیه تعریف کنید یا همزمان با تعریف، یک مقدار اولیه به آن اختصاص دهید.
DECLARE @variable_name data_type;
این سینتکس برای تعریف یک متغیر به نام `variable_name` با نوع دادهای `data_type` استفاده میشود، بدون اینکه در ابتدا مقداری به آن اختصاص داده شود. متغیر پس از تعریف، دارای مقدار NULL خواهد بود.
DECLARE @variable_name data_type = initial_value;
در این روش، شما نه تنها متغیر را تعریف میکنید، بلکه همزمان یک `initial_value` (مقدار اولیه) نیز به آن اختصاص میدهید. این کار میتواند کد شما را کوتاهتر و خواناتر کند.
به عنوان مثال، برای تعریف یک متغیر به نام `TotalSales` از نوع `MONEY` که در ابتدا مقدار NULL دارد، و یک متغیر دیگر به نام `ProductName` از نوع `NVARCHAR(100)` با مقدار اولیه ‘Laptop’:
DECLARE @TotalSales MONEY;
DECLARE @ProductName NVARCHAR(100) = 'Laptop';
SELECT @TotalSales AS 'فروش کل', @ProductName AS 'نام محصول';
اختصاص مقادیر به متغیرهای SQL
پس از تعریف یک متغیر، میتوانید از دو دستور اصلی برای اختصاص یا بهروزرسانی مقدار آن استفاده کنید: `SET` و `SELECT`. هر دو دستور کارکرد مشابهی دارند، اما در برخی جزئیات رفتاری متفاوت عمل میکنند.
SET @variable_name = expression;
دستور `SET` روش استاندارد و توصیه شده برای اختصاص یک مقدار به یک متغیر است. شما میتوانید یک مقدار ثابت، نتیجه یک عبارت محاسباتی، یا خروجی یک کوئری اسکالر (کوئری که تنها یک سطر و یک ستون برمیگرداند) را به آن اختصاص دهید.
SELECT @variable_name = expression;
دستور `SELECT` نیز میتواند برای اختصاص مقدار به متغیرها استفاده شود. یکی از مزایای `SELECT` این است که میتوانید همزمان به چندین متغیر مقدار اختصاص دهید. همچنین اگر کوئری هیچ ردیفی برنگرداند، `SET` متغیر را به NULL تغییر میدهد، در حالی که `SELECT` مقدار فعلی متغیر را حفظ میکند.
مثالهایی برای اختصاص مقادیر:
DECLARE @Name VARCHAR(50);
SET @Name = 'سارا احمدی';
SELECT @Name AS 'نام کاربر';
DECLARE @Count INT;
SELECT @Count = COUNT(*) FROM sys.objects;
SELECT @Count AS 'تعداد اشیاء';
همچنین میتوانید چندین متغیر را با یک دستور `SELECT` مقداردهی کنید:
SELECT @variable1 = expression1, @variable2 = expression2;
این قابلیت زمانی مفید است که بخواهید چندین مقدار را از یک سطر جدول یا نتایج یک کوئری به متغیرهای مختلف اختصاص دهید:
DECLARE @LastName NVARCHAR(50), @FirstName NVARCHAR(50);
SELECT @LastName = LastName, @FirstName = FirstName FROM Person.Person WHERE BusinessEntityID = 1;
SELECT @LastName AS 'نام خانوادگی', @FirstName AS 'نام';
محدوده (Scope) متغیرهای SQL
محدوده متغیر در T-SQL به قسمتی از کد اشاره دارد که در آن متغیر قابل دسترسی و استفاده است. متغیرهای محلی (که با @ شروع میشوند) در Batch یا بلوکی از کد که تعریف شدهاند، دارای محدوده هستند. این به این معنی است که یک متغیر تعریف شده در یک Batch نمیتواند مستقیماً در Batch بعدی استفاده شود، مگر اینکه Batchها با GO از هم جدا نشده باشند. در روالهای ذخیره شده یا توابع، متغیرها تنها در داخل همان روال یا تابع قابل دسترسی هستند.
به عنوان مثال:
-- Batch 1
DECLARE @TestVar INT = 10;
SELECT @TestVar AS 'متغیر در Batch 1';
GO
-- Batch 2
-- اگر @TestVar در اینجا فراخوانی شود، خطا میدهد زیرا خارج از محدوده است.
-- SELECT @TestVar AS 'متغیر در Batch 2';
-- این خط باعث خطا میشود.
متغیرهای سراسری (Global Variables)
متغیرهای سراسری در SQL Server، که همیشه با `@@` شروع میشوند، متغیرهای سیستمی هستند که اطلاعات مختلفی در مورد وضعیت سرور، نشست (session) فعلی، یا اطلاعات مربوط به آخرین اجرای یک دستور را نگهداری میکنند. این متغیرها توسط سیستم تعریف و نگهداری میشوند و شما نمیتوانید آنها را تعریف یا مقداردهی کنید. آنها در هر Batch و هر Scope قابل دسترسی هستند.
برخی از متغیرهای سراسری پرکاربرد:
SELECT @@IDENTITY AS LastIdentity;
این متغیر آخرین مقدار Identity تولید شده در نشست فعلی را برمیگرداند، صرف نظر از اینکه در چه جدول یا دامنهای ایجاد شده باشد. این متغیر پس از عملیات INSERT یا SELECT INTO که ستون IDENTITY را تغییر میدهد، بهروزرسانی میشود.
SELECT @@ROWCOUNT AS RowsAffected;
تعداد ردیفهایی را که توسط آخرین دستور T-SQL تحت تأثیر قرار گرفتهاند، برمیگرداند. این برای بررسی موفقیت عملیات UPDATE، DELETE، INSERT یا حتی SELECT بسیار مفید است.
SELECT @@VERSION AS SQLServerVersion;
اطلاعات مربوط به نسخه، معماری و تاریخ ساخت SQL Server فعلی را نمایش میدهد. این اطلاعات برای پشتیبانی و تشخیص مشکلات سیستم بسیار کاربردی است.
SELECT @@ERROR AS LastError;
شماره خطای آخرین دستور T-SQL را برمیگرداند. اگر دستور با موفقیت اجرا شده باشد، مقدار 0 را برمیگرداند. این متغیر برای مدیریت خطا در اسکریپتها و روالهای ذخیرهشده حیاتی است.
SELECT @@SERVERNAME AS ServerName;
نام محلی سروری را که SQL Server در حال اجراست، برمیگرداند.
استفاده از متغیرها در کوئریها
متغیرها را میتوان تقریباً در هر بخشی از یک کوئری T-SQL استفاده کرد تا آن را پویا و انعطافپذیرتر کند. این شامل استفاده در بندهای WHERE، SELECT، JOIN، و حتی در ساختار داینامیک کوئریها میشود.
مثالهایی برای استفاده از متغیرها در کوئریها:
DECLARE @MinQuantity INT = 50;
SELECT ProductName, Quantity FROM Production.ProductInventory WHERE Quantity > @MinQuantity;
در این مثال، متغیر `@MinQuantity` در بند WHERE برای فیلتر کردن نتایج بر اساس حداقل مقدار موجودی استفاده شده است. این به شما امکان میدهد تا بدون تغییر خود کوئری، معیار فیلتر را به راحتی تغییر دهید.
DECLARE @SearchTerm NVARCHAR(100) = 'mountain bike';
SELECT ProductID, Name FROM Production.Product WHERE Name LIKE '%' + @SearchTerm + '%';
در اینجا، `@SearchTerm` برای جستجو در نام محصولات استفاده میشود، که انعطافپذیری زیادی در ایجاد ابزارهای جستجو فراهم میکند.
DECLARE @EmployeeID INT = 273;
SELECT BusinessEntityID, HireDate, JobTitle FROM HumanResources.Employee WHERE BusinessEntityID = @EmployeeID;
این مثال نشان میدهد که چگونه یک متغیر میتواند به عنوان پارامتر ورودی برای یک کوئری استفاده شود تا اطلاعات یک کارمند خاص را بازیابی کند.
نمونه اسکریپتهای کاربردی با متغیرها
متغیرها قابلیتهای گستردهای در توسعه اسکریپتهای پیچیدهتر، حلقهها، و روالهای ذخیره شده به شما میدهند.
تعریف و استفاده از متغیرها در یک حلقه WHILE:
DECLARE @Counter INT = 0;
WHILE @Counter < 5
BEGIN
PRINT 'شمارنده فعلی: ' + CAST(@Counter AS VARCHAR);
SET @Counter = @Counter + 1;
END;
این اسکریپت یک متغیر `@Counter` را از 0 تا 4 افزایش میدهد و در هر مرحله مقدار آن را چاپ میکند. این ساختار در بسیاری از سناریوهای برنامهنویسی پایگاه داده مانند پردازش دستهای یا تولید داده کاربرد دارد.
استفاده از متغیر در روال ذخیره شده:
CREATE PROCEDURE GetEmployeeName
@ID INT
AS
BEGIN
DECLARE @FName NVARCHAR(50);
SELECT @FName = FirstName FROM HumanResources.Employee WHERE BusinessEntityID = @ID;
SELECT @FName AS 'نام کارمند';
END;
در این مثال، یک روال ذخیره شده به نام `GetEmployeeName` تعریف شده است که یک پارامتر `@ID` دریافت میکند. در داخل روال، از یک متغیر محلی `@FName` برای ذخیره نام کارمند استفاده شده و سپس آن نام را برمیگرداند. این رویکرد به ایجاد کدهای ماژولار و قابل استفاده مجدد کمک میکند.
برای اجرای روال ذخیره شده بالا:
EXEC GetEmployeeName 273;
این دستور روال ذخیره شده `GetEmployeeName` را با شناسه کاربری 273 فراخوانی میکند و نام کارمند مربوطه را نمایش میدهد.
با درک و استفاده صحیح از متغیرهای SQL، میتوانید اسکریپتها و برنامههای پایگاه داده قدرتمندتر، خواناتر و با کارایی بالاتری توسعه دهید. این یک مهارت اساسی برای هر توسعهدهنده T-SQL است که به بهبود کیفیت و نگهداری کدهای شما کمک شایانی میکند.
“`