راهنمای جامع تعریف متغیر (DECLARE) SQL Server بهینه سازی TSQL

تعریف متغیر (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 اطلاعاتی در مورد نسخه و ویرایش اس‌کیو‌ال سرور نصب شده را برمی‌گرداند.

من علی دستجردی‌ام؛ عاشق کار با دیتا، از SQL Server تا بیگ‌دیتا و هوش مصنوعی. دغدغه‌ام کشف ارزش داده‌ها و به‌اشتراک‌گذاری تجربه‌هاست. ✦ رزومه من: alidastjerdi.com ✦

عضویت
منو باخبر کن!!!
guest
نام
ایمیل

0 دیدگاه
Inline Feedbacks
دیدن تمامی کامنتها

فوتر سایت

ورود به سایت

sqlyar

هنوز عضو نیستید؟

ورود به سایت

هنوز تبت نام نکردید ؟