[SQL] 변수를 할당 할 때 SELECT 대 SET?
SQL변수를 할당 할 때 SELECT 대 SET?
는 SET과 SELECT 문 T-SQL에서 변수를 할당의 차이점은 무엇입니까?
해결법
-
==============================
1.이 글에서 요약 한 견적 :
이 글에서 요약 한 견적 :
-
==============================
2.나는 선택이 아닌 반면, SET는 ANSI 표준을 믿습니다. 또한 값이 발견되지 않는 경우 아래의 예 SELECT 대 SET의 다른 동작을 확인합니다.
나는 선택이 아닌 반면, SET는 ANSI 표준을 믿습니다. 또한 값이 발견되지 않는 경우 아래의 예 SELECT 대 SET의 다른 동작을 확인합니다.
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' */
-
==============================
3.쿼리를 작성하는 경우,이 차이는 명심해야한다 :
쿼리를 작성하는 경우,이 차이는 명심해야한다 :
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*/
-
==============================
4.이외에도 ANSI 및 속도 등을되는 한에서, 항상 나에게 중요한 매우 중요한 차이가있다; ANSI 및 속도보다 더. 때문에이 중요한 간과 내가 해결 한 버그의 수는 크다. 나는 코드 리뷰하는 동안이 모든 시간을 찾습니다.
이외에도 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에 "결과에서 마지막 항목"일부 사소한를 할당 할 것이기 때문에 그 놀라운 매우 중요하다. 어떤 오류가 발생하지 않습니다 선택하고 분을 보낼 것으로, 시간 디버깅.
아마, 당신은 하나의 아이디를 찾고 있습니다 및 SET는 쿼리를 해결하기 위해 강제 것입니다. 따라서 당신이 뭔가를 같이 할 수 있습니다 :
-- Act -- Notice the where clause set @employeeId = (select e.EmployeeId from dbo.Employee e where e.EmployeeId = 1); print @employeeId;
대청소
drop table Employee;
결론적으로, 사용 :
from https://stackoverflow.com/questions/3945361/set-versus-select-when-assigning-variables by cc-by-sa and MIT license
'SQL' 카테고리의 다른 글
[SQL] select 문에서 현지 시간으로 UTC에서 날짜 시간 열을 변환 (0) | 2020.03.18 |
---|---|
[SQL] SQL Server에 대한 "LIKE"와 "IN"을 결합 [중복] (0) | 2020.03.18 |
[SQL] IN 값에 대한 반환 기본 결과에 관계없이 (0) | 2020.03.18 |
[SQL] 에서 VARCHAR 날짜 시간으로 변환하는 방법 (0) | 2020.03.18 |
[SQL] SQL 서버에서 레코드를 삭제 한 후 다시 설정 신원 씨 (0) | 2020.03.18 |