동료의 스크립트를 실행할 때 위의 ‘ANSI 경고’메시지를 오늘 보았습니다 (그리고 많은 경고문 중 경고가 표시되는 원인을 모르겠습니다).
과거에 나는 그것을 무시했다 : 나는 널 스스로 피하고 따라서 그것들을 제거하는 것은 내 책에서 좋은 일이다! 그러나 오늘 ‘SET’이라는 단어가 문자 그대로 나에게 소리 쳤으며이 문맥에서 단어의 의미가 무엇인지 모른다는 것을 깨달았습니다.
대문자라는 사실을 바탕으로 한 첫 번째 생각은 SET
키워드를 참조하고 ‘할당’을 의미한다는 것입니다.
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
SQL Server 도움말에 따르면 ‘ANSI 경고’기능은 ISO / ANSI SQL-92를 기반으로하며 하위 절 제목에서 제목 설정의 경우 ‘Set operation’이라는 용어를 한 번만 사용합니다. 데이터 할당 섹션. 그러나 오류 메시지에 대한 빠른 인터넷 검색 후 SELECT
할당이 관련되지 않은 쿼리 인 예제가 표시됩니다 .
SQL Server 경고의 문구를 기반으로 한 두 번째 생각은 set의 수학적 의미가 함축되어 있다는 것입니다. 그러나 SQL의 집계가 엄격하게 설정 작업을 말하고 있다고 생각하지 않습니다. SQL Server 팀이이를 집합 작업으로 간주하더라도 ‘set’이라는 단어를 대문자로 사용하는 목적은 무엇입니까?
인터넷 검색 중에 SQL Server 오류 메시지가 나타났습니다.
Table 'T' does not have the identity property. Cannot perform SET operation.
같은 경우에 동일한 단어 ‘SET operation’은 IDENTITY_INSERT
속성 의 할당 만 참조 할 수있어 처음으로 다시 생각하게됩니다.
누구든지 그 문제에 대해 밝힐 수 있습니까?
답변
방금 SQL-92 사양 을 살펴보면서이 질문을 상기시켜주는 구절을 보았습니다.
실제로이 상황에 대해 다음과 같이 규정 된 경고가 있습니다.
b) 그렇지 않으면 TX
<value expression>
를 T의 각 행에 적용하고 null 값을 제거한 결과 인 단일 열 테이블로 둡니다 . 하나 이상의 널값이 제거되면 완료 조건이 발생합니다. 경고 : set 함수에서 null 값이 제거되었습니다 .
필자 SET
는 SQL Server 오류 메시지의 동의어라는 것을 알 수있는 한 집계와 다른 집합 함수를 구별하는 이유를 모르겠지만 오류 메시지의 집합 함수에 대한 참조 라고 가정합니다 . 문법의 관련 부분은 다음과 같습니다.
6.5 <set function specification>
Function
Specify a value derived by the application of a function to an
argument.
Format
<set function specification> ::=
COUNT <left paren> <asterisk> <right paren>
| <general set function>
<general set function> ::=
<set function type>
<left paren> [ <set quantifier> ] <value expression> <right paren>
<set function type> ::=
AVG | MAX | MIN | SUM | COUNT
<set quantifier> ::= DISTINCT | ALL
답변
빠른 답변
“다른 SET *는 아마도 이전 SQL Server 버전과 관련이있을 것입니다.
SQL Server 6.5 및 7과 함께 일할 때 더 많이 보았지만 확실했습니다. 많은 단점이 해결되었으며 SQL Server는 표준을 더 따릅니다.
더 길게:
요즘 메시지는 SET ANSI_WARNINGS
기본값으로 제어됩니다 ON
.
이것은 순전히
- 집계에서 NULL 값으로 경고가 생성됩니다.
- varchar 유형 필드의 삽입 / 업데이트에서 자동 잘림이 발생합니다.
한 가지 예 :
DECLARE @foo TABLE (bar int NULL);
INSERT @foo VALUES (1), (2), (NULL);
SET ANSI_WARNINGS ON;
SELECT SUM(bar) FROM @foo;
SET ANSI_WARNINGS OFF;
SELECT SUM(bar) FROM @foo;
준다
(3 row(s) affected)
---- -----------
ON 3
Warning: Null value is eliminated by an aggregate or other SET operation.
(1 row(s) affected)
---- -----------
OFF 3
(1 row(s) affected)
또 다른 예:
DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS ON;
INSERT @foo VALUES ('123456'); -- error
GO
DECLARE @foo TABLE (bar varchar(5) NULL);
SET ANSI_WARNINGS OFF;
INSERT @foo VALUES ('123456'); -- OK
GO
개인적으로 나는 경고를 무시하고 계산 된 열과 OFF 설정의 인덱싱 된 뷰에 대한 다른 결과로 인해 SET ANSI_WARNINGS를 ON으로 둡니다.
마지막으로이 경고를 생성하는 트리거 또는 계산 열 또는 인덱싱 된 뷰가있을 수 있습니다.
답변
경고의 다른 측면은 나에게 메시지 버그처럼 보이는 ‘SET’작업이 아닌 ‘set’작업을 나타냅니다. 예를 들어 창 기능으로 생성됩니다.
select max(foo) over() as max_foo from (values (1), (2), (null)) as t(foo);
/*
max_foo
-------
2
2
2
Warning: Null value is eliminated by an aggregate or other SET operation.
*/