programing

변수를 할당할 때 SET vs SELECT?

bestprogram 2023. 4. 7. 22:00

변수를 할당할 때 SET vs SELECT?

의 차이점은 무엇입니까?SET그리고.SELECTT-SQL에서 변수를 할당할 때 문을 사용할 수 있습니까?

이 기사에서 요약한 인용문:

  1. SET는 변수 할당을 위한 ANSI 표준이지만 SELECT는 그렇지 않습니다.
  2. SET는 한 번에 하나의 변수만 할당할 수 있으며 SELECT는 한 번에 여러 변수를 할당할 수 있습니다.
  3. 쿼리에서 할당하는 경우 SET는 스칼라 값만 할당할 수 있습니다.쿼리가 여러 값/행을 반환하는 경우 SET은 오류를 발생시킵니다.SELECT는 변수에 값 중 하나를 할당하고 여러 값이 반환된 사실을 숨깁니다(따라서 다른 곳에서 문제가 발생한 이유를 알 수 없습니다.그 값을 트러블 슈팅해 보세요).
  4. 쿼리에서 값을 할당할 때 반환된 값이 없으면 SET은 NULL을 할당합니다.여기서 SELECT는 할당을 전혀 하지 않습니다(따라서 변수는 이전 값에서 변경되지 않습니다).
  5. 속도 차이는 SET와 SELECT 사이에 직접적인 차이는 없습니다.그러나 SELECT는 한 번에 여러 개의 할당을 수행할 수 있기 때문에 SET에 비해 약간 속도가 유리합니다.

믿어요SETANSI 표준이지만,SELECT그렇지 않습니다.또, 의 동작에 주의해 주세요.SET대.SELECT값을 찾을 수 없는 경우 다음 예에서 보여 줍니다.

declare @var varchar(20)
set @var = 'Joe'
set @var = (select name from master.sys.tables where name = 'qwerty')
select @var /* @var is now NULL */

set @var = 'Joe'
select @var = name from master.sys.tables where name = 'qwerty'
select @var /* @var is still equal to 'Joe' */

쿼리를 쓸 때는 다음 차이점에 유의해야 합니다.

DECLARE @A INT = 2

SELECT  @A = TBL.A
FROM    ( SELECT 1 A ) TBL
WHERE   1 = 2

SELECT  @A
/* @A is 2*/

---------------------------------------------------------------

DECLARE @A INT = 2

SET @A = ( 
            SELECT  TBL.A
            FROM    ( SELECT 1 A) TBL
            WHERE   1 = 2
         )

SELECT  @A
/* @A is null*/

ANSI와 속도 등에는 ANSI와 속도 이상의 매우 중요한 차이가 있습니다.이 중요한 간과로 인해 제가 수정한 버그의 수가 많습니다.코드 리뷰를 할 때 항상 찾아요.

-- Arrange
create table Employee (EmployeeId int);
insert into dbo.Employee values (1);
insert into dbo.Employee values (2);
insert into dbo.Employee values (3);

-- Act
declare @employeeId int;
select @employeeId = e.EmployeeId from dbo.Employee e;

-- Assert
-- This will print 3, the last EmployeeId from the query (an arbitrary value)
-- Almost always, this is not what the developer was intending. 
print @employeeId; 

대부분의 경우 개발자의 의도는 그렇지 않습니다.위의 경우 쿼리는 간단하지만 매우 복잡한 쿼리를 봐왔기 때문에 단일 값을 반환할지 여부를 파악하는 것은 간단한 일이 아닙니다.쿼리는 보통 이것보다 더 복잡하며 우연히 단일 값을 반환하게 됩니다.현상제 테스트 중에는 문제가 없습니다.그러나 이것은 똑딱거리는 폭탄과 같으며 쿼리가 여러 결과를 반환할 때 문제를 일으킬 것입니다. 왜일까요?이는 단순히 변수에 마지막 값을 할당하기 때문입니다.

그럼 여러분도 해 요?SET:

 -- Act
 set @employeeId = (select e.EmployeeId from dbo.Employee e);

다음과 같은 오류가 표시됩니다.

하위 쿼리가 두 개 이상의 값을 반환했습니다.하위 쿼리가 =, !=, <, <=, >= 뒤에 있거나 하위 쿼리가 식으로 사용되는 경우에는 허용되지 않습니다.

'결과의 을 '결과의 마지막 항목'에 합니다.★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★」@employeeId★★★★★★★★★★★★★★★★select에러는 발생하지 않고, 몇 분, 몇 시간 동안 디버깅을 실시합니다.

당신은 의 ID를 SET쿼리를 강제로 수정합니다.

-- Act
-- Notice the where clause
set @employeeId = (select e.EmployeeId from dbo.Employee e where e.EmployeeId = 1);
print @employeeId;

정리하다

drop table Employee;

마지막으로 다음을 사용합니다.

  • SET: 변수에 단일 값을 할당하고 변수가 단일 값일 경우.
  • SELECT ★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★변수는 테이블, 임시 테이블 또는 테이블 변수 등이 될 수 있습니다.

선택한 모든 항목을 ()로 둘러쌉니다.1개의 아이템만 반품하는 것을 확인합니다.

ET @sql_update =  (select left(@sql_update, len(@sql_update)-1))
SET @Telephone2 = (SELECT REPLACE(LTRIM(REPLACE(@Telephone2, '0', ' ')), ' ', '0'))

언급URL : https://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables