변수를 할당할 때 SET vs SELECT?
의 차이점은 무엇입니까?SET
그리고.SELECT
T-SQL에서 변수를 할당할 때 문을 사용할 수 있습니까?
이 기사에서 요약한 인용문:
- SET는 변수 할당을 위한 ANSI 표준이지만 SELECT는 그렇지 않습니다.
- SET는 한 번에 하나의 변수만 할당할 수 있으며 SELECT는 한 번에 여러 변수를 할당할 수 있습니다.
- 쿼리에서 할당하는 경우 SET는 스칼라 값만 할당할 수 있습니다.쿼리가 여러 값/행을 반환하는 경우 SET은 오류를 발생시킵니다.SELECT는 변수에 값 중 하나를 할당하고 여러 값이 반환된 사실을 숨깁니다(따라서 다른 곳에서 문제가 발생한 이유를 알 수 없습니다.그 값을 트러블 슈팅해 보세요).
- 쿼리에서 값을 할당할 때 반환된 값이 없으면 SET은 NULL을 할당합니다.여기서 SELECT는 할당을 전혀 하지 않습니다(따라서 변수는 이전 값에서 변경되지 않습니다).
- 속도 차이는 SET와 SELECT 사이에 직접적인 차이는 없습니다.그러나 SELECT는 한 번에 여러 개의 할당을 수행할 수 있기 때문에 SET에 비해 약간 속도가 유리합니다.
믿어요SET
ANSI 표준이지만,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
'programing' 카테고리의 다른 글
TEX란TIMAGE_ON [Primary]? (0) | 2023.04.07 |
---|---|
String을 사용하는 이유포맷? (0) | 2023.04.07 |
SQL Server 문자열에서 최신 변환 (0) | 2023.04.07 |
기존 열의 기본값을 설정하는 방법 (0) | 2023.04.07 |
SQL Server의 임시 테이블과 테이블 변수의 차이점은 무엇입니까? (0) | 2023.04.07 |