مقایسه SET و SELECT در اختصاص مقادیر به متغیرها در SQL Server: راهنمای کامل برای متخصصان پایگاه داده
در هنگام کدنویسی T-SQL در SQL Server، یکی از سوالاتی که به کرات مطرح میشود این است که برای اختصاص مقادیر به متغیرها، چه زمانی باید از SET و چه زمانی از SELECT استفاده کرد.
اختصاص یک مقدار واحد به یک متغیر با SET و SELECT هر دو ساده است. با استفاده از دستور SET، میتوانید یک مقدار را به متغیر خود اختصاص دهید:
DECLARE @Variable int; SET @Variable = 1;
مشابهاً، دستور SELECT نیز میتواند برای اختصاص یک مقدار واحد به متغیر استفاده شود:
DECLARE @Variable int; SELECT @Variable = 1;
تفاوت اصلی زمانی آشکار میشود که یک کوئری بیش از یک سطر را برگرداند. برای درک بهتر این موضوع، فرض کنید یک جدول به نام MyTable داریم که حاوی ستونی به نام MyColumn است. اگر کوئری شما یک مقدار واحد را برگرداند، هر دو دستور SET و SELECT به درستی عمل میکنند:
DECLARE @Variable int; SELECT @Variable = MyColumn FROM MyTable WHERE MyKey = 'A';
در این حالت، اگر کوئری بالا یک سطر برگرداند، متغیر @Variable مقدار MyColumn را از آن سطر دریافت میکند.
زمانی که چندین مقدار به یک متغیر اختصاص داده میشود، رفتار SET و SELECT متفاوت است. اگر قصد داشته باشید با استفاده از SET مقداری را به متغیری اختصاص دهید و کوئری شما بیش از یک سطر را برگرداند، دستور با خطا مواجه خواهد شد. به عنوان مثال:
DECLARE @Variable int; SET @Variable = (SELECT MyColumn FROM MyTable WHERE MyKey IN ('A','B'));
اجرای این کد منجر به خطای Subquery returned more than 1 value. This is not permitted when the subquery follows =, !=, <, <=, >, >= or when it is used as an expression. میشود، زیرا SET انتظار یک مقدار واحد را دارد.
در مقابل، اگر با استفاده از SELECT بخواهید مقداری را به متغیری اختصاص دهید و کوئری چندین سطر را برگرداند، متغیر به آخرین مقدار بازگردانده شده از کوئری تنظیم میشود و خطایی رخ نمیدهد:
DECLARE @Variable int; SELECT @Variable = MyColumn FROM MyTable WHERE MyKey IN ('A','B');
در این حالت، SQL Server چندین سطر را پردازش میکند، اما فقط مقدار ستون MyColumn از آخرین سطر پردازش شده به متغیر @Variable اختصاص مییابد.
یکی دیگر از تفاوتهای مهم، امکان اختصاص چندین متغیر از یک کوئری واحد است. با استفاده از SET، شما باید برای هر متغیری که قصد اختصاص مقدار به آن را دارید، یک دستور جداگانه صادر کنید:
DECLARE @Variable1 int, @Variable2 int; SET @Variable1 = (SELECT Column1 FROM MyTable WHERE SomeCondition); SET @Variable2 = (SELECT Column2 FROM MyTable WHERE SomeCondition);
این روش در مواردی که نیاز به اختصاص مقادیر از نتایج یک کوئری پیچیده باشد، میتواند باعث تکرار و کاهش کارایی شود.
در حالی که با SELECT، میتوانید مقادیر را به چندین متغیر در یک دستور واحد اختصاص دهید که کد را خواناتر و کارآمدتر میکند:
DECLARE @Variable1 int, @Variable2 int; SELECT @Variable1 = Column1, @Variable2 = Column2 FROM MyTable WHERE SomeCondition;
این روش به خصوص زمانی که نیاز دارید چندین ستون از یک سطر را به متغیرهای مختلف اختصاص دهید، بسیار مفید است.
در مورد عملکرد SET در مقابل SELECT، در اکثر موارد تفاوت قابل توجهی وجود ندارد. هنگامی که یک مقدار واحد به یک متغیر اختصاص داده میشود، اختلاف عملکرد بین SET و SELECT ناچیز است و نیازی به نگرانی نیست. اما اگر چندین متغیر را بر اساس یک کوئری واحد اختصاص میدهید، SELECT احتمالاً عملکرد بهتری خواهد داشت، زیرا فقط نیاز دارد یک بار جدول را کوئری کند. در غیر این صورت، تفاوت عملکرد برای این نوع انتصابها چیزی نیست که نگران آن باشید.
همچنین، توجه به این نکته مهم است که SET استاندارد ANSI برای اختصاص مقادیر به متغیرها است، در حالی که SELECT در SQL Server (و برخی پایگاههای داده دیگر) برای اختصاص مقادیر به متغیرها خاص است.