تعریف متغیر (DECLARE) در SQL Server: راهنمای جامع T-SQL برای بهینهسازی کوئریها
برای استفاده کارآمد از اسکیوال سرور، درک نحوه تعریف و مدیریت متغیرها ضروری است. متغیرها به شما امکان میدهند تا مقادیر را به صورت موقت ذخیره کرده و در کوئریها، اسکریپتها و رویههای ذخیرهشده خود استفاده کنید. این قابلیت به بهینهسازی، خوانایی و انعطافپذیری کدهای T-SQL کمک شایانی میکند.
برای تعریف یک متغیر در اسکیوال سرور، از کلمه کلیدی DECLARE
استفاده میکنیم. پس از آن، نام متغیر را که با علامت @
شروع میشود و سپس نوع داده آن را مشخص میکنیم. برای اختصاص یک مقدار به متغیر نیز میتوانید از SET
یا SELECT
استفاده کنید.
مثال زیر نحوه تعریف یک متغیر رشتهای، تخصیص مقدار به آن و نمایش مقدار را نشان میدهد:
DECLARE @TestVariable VARCHAR(20)
SET @TestVariable = 'Test Value'
SELECT @TestVariable AS OutputValue
شما میتوانید چندین متغیر را به طور همزمان با جدا کردن آنها با کاما (,
) تعریف کنید. این روش به کد شما نظم بیشتری میدهد و آن را خواناتر میکند.
DECLARE @Variable1 INT, @Variable2 VARCHAR(50), @Variable3 DATE
SET @Variable1 = 10
SET @Variable2 = 'Hello SQL Server'
SET @Variable3 = '2023-10-27'
SELECT @Variable1 AS IntValue, @Variable2 AS StringValue, @Variable3 AS DateValue
اسکیوال سرور امکان تخصیص مقدار اولیه به یک متغیر را در همان خط تعریف (DECLARE
) فراهم میکند. این کار به سادگی با استفاده از عملگر مساوی (=
) انجام میشود.
DECLARE @InitializedVar VARCHAR(30) = 'Initial Value'
SELECT @InitializedVar AS InitializedOutput
یکی از کاربردهای قدرتمند متغیرها، تخصیص مقدار از نتیجه یک کوئری است. میتوانید از SELECT
برای این منظور استفاده کنید. این روش برای بازیابی مقادیر دینامیک از جداول بسیار مفید است.
DECLARE @EmployeeName VARCHAR(100)
SELECT @EmployeeName = Name FROM Employees WHERE EmployeeID = 1
SELECT @EmployeeName AS RetrievedName
اگر کوئری بیش از یک سطر را برگرداند، متغیر مقدار آخرین سطر را خواهد گرفت. در صورتی که کوئری هیچ سطری را برنگرداند، متغیر مقدار NULL
را خواهد داشت.
در مقابل، SET
برای تخصیص یک مقدار واحد یا نتیجه یک عبارت به متغیر استفاده میشود و نمیتواند به طور مستقیم از کوئریای که چندین سطر برمیگرداند، مقدار بگیرد.
DECLARE @Number INT
SET @Number = 10 + 5
SELECT @Number AS CalculationResult
متغیرها را میتوان به راحتی در بخشهای مختلف کوئریها مانند شرط WHERE
، دستورات INSERT
، UPDATE
و DELETE
به کار برد. این امر انعطافپذیری زیادی به اسکریپتهای شما میدهد و به شما امکان میدهد کوئریهای دینامیکتر و پارامتریکتر ایجاد کنید.
DECLARE @MinSales DECIMAL(10, 2) = 1000.00
SELECT ProductName, SalesAmount FROM Products WHERE SalesAmount >= @MinSales
DECLARE @NewProductName VARCHAR(100) = 'Laptop Pro'
DECLARE @NewProductPrice DECIMAL(18, 2) = 1200.50
INSERT INTO Products (ProductName, Price) VALUES (@NewProductName, @NewProductPrice)
SELECT * FROM Products WHERE ProductName = @NewProductName
DECLARE @ProductIDToUpdate INT = 5
DECLARE @NewPrice DECIMAL(18, 2) = 1500.00
UPDATE Products SET Price = @NewPrice WHERE ProductID = @ProductIDToUpdate
SELECT * FROM Products WHERE ProductID = @ProductIDToUpdate
دامنه (Scope) یک متغیر در اسکیوال سرور به مجموعهای از دستورات اطلاق میشود که متغیر در آنها قابل دسترسی است. به طور پیشفرض، متغیرهای محلی در همان “batch” یا بلوک کدی که در آن تعریف شدهاند، اعتبار دارند. استفاده از دستور GO
یک “batch” را خاتمه میدهد و به این معنی است که متغیرهای تعریف شده در batch قبلی دیگر قابل دسترسی نیستند.
DECLARE @TestVar INT = 10
SELECT @TestVar AS FirstBatchValue
GO
-- This will cause an error as @TestVar is out of scope
-- SELECT @TestVar AS SecondBatchValue
همانطور که در مثال بالا مشاهده میشود، پس از GO
، متغیر @TestVar
از دسترس خارج میشود و تلاش برای دسترسی به آن منجر به خطا خواهد شد.
متغیرهای جدولی (Table Variables) نوع خاصی از متغیرها هستند که به شما امکان میدهند دادههای جدولی را در حافظه ذخیره کنید. آنها بسیار شبیه جداول موقت (temporary tables) هستند اما دارای دامنه محلیتر و سربار کمتری برای مدیریت هستند. این نوع متغیرها برای ذخیرهسازی موقت نتایج میانی کوئریها یا لیستهای کوچک داده بسیار کارآمد هستند.
DECLARE @ProductList TABLE (
ProductID INT,
ProductName VARCHAR(100)
)
INSERT INTO @ProductList (ProductID, ProductName) VALUES (1, 'Laptop')
INSERT INTO @ProductList (ProductID, ProductName) VALUES (2, 'Mouse')
SELECT * FROM @ProductList
اگر هنگام تعریف یک متغیر، مقداری به آن اختصاص ندهید، اسکیوال سرور به صورت خودکار مقدار آن را NULL
(تهی) تنظیم میکند. برای بررسی اینکه آیا یک متغیر NULL
است یا خیر، باید از عبارت IS NULL
یا IS NOT NULL
استفاده کنید، نه از عملگر مساوی (=
).
DECLARE @NullVar INT
SELECT @NullVar AS InitialNullValue
IF @NullVar IS NULL
PRINT 'The variable is NULL'
ELSE
PRINT 'The variable is NOT NULL'
SET @NullVar = 10
IF @NullVar IS NULL
PRINT 'The variable is NULL'
ELSE
PRINT 'The variable is NOT NULL'
این رفتار به دلیل نحوه مدیریت مقادیر NULL
در اسکیوال سرور است که در حالت پیشفرض (SET ANSI_NULLS ON
) NULL = NULL
به UNKNOWN
ارزیابی میشود و نه TRUE
.
علاوه بر متغیرهای محلی که خودتان تعریف میکنید، اسکیوال سرور دارای متغیرهای سراسری (Global Variables) نیز هست که با پیشوند @@
مشخص میشوند. این متغیرها توسط سیستم تعریف شدهاند و اطلاعات مفیدی در مورد وضعیت سرور، خطاهای اخیر و سایر تنظیمات سیستم ارائه میدهند. شما نمیتوانید این متغیرها را تعریف یا مقداردهی کنید، بلکه فقط میتوانید مقادیر آنها را بخوانید.
SELECT @@VERSION AS SQLServerVersion
متغیر @@VERSION
اطلاعاتی در مورد نسخه و ویرایش اسکیوال سرور نصب شده را برمیگرداند.