Ý nghĩa của 'SET' trong thông báo lỗi 'Giá trị Null bị loại bỏ bởi một hoạt động tổng hợp hoặc hoạt động khác'


18

Tôi đã thấy thông báo 'Cảnh báo ANSI' ở trên hôm nay khi chạy tập lệnh của đồng nghiệp (và tôi không biết câu nào trong số nhiều câu đã gây ra cảnh báo được hiển thị).

Trong quá khứ tôi đã bỏ qua nó: Tôi tránh bản thân mình và vì vậy bất cứ điều gì sẽ loại bỏ chúng là một điều tốt trong cuốn sách của tôi! Tuy nhiên, hôm nay, từ "TẬP" theo nghĩa đen đã hét lên với tôi và tôi nhận ra rằng tôi không biết ý nghĩa của từ này là gì trong ngữ cảnh này.

Suy nghĩ đầu tiên của tôi, dựa trên thực tế là chữ hoa, là nó đang đề cập đến SETtừ khóa và có nghĩa là 'bài tập', như trong

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

Theo Trợ giúp Máy chủ SQL, tính năng 'Cảnh báo ANSI' dựa trên ISO / ANSI SQL-92, thông số kỹ thuật chỉ sử dụng một thuật ngữ 'Đặt thao tác' trong tiêu đề phụ, trong trường hợp tiêu đề, trong trường hợp tiêu đề, trong trường hợp tiêu đề phần gán dữ liệu. Tuy nhiên, sau khi thông báo nhanh về thông báo lỗi, tôi thấy các ví dụ là SELECTcác truy vấn dường như không có nhiệm vụ liên quan.

Suy nghĩ thứ hai của tôi, dựa trên từ ngữ của cảnh báo SQL Server, là ý nghĩa toán học của tập hợp được ngụ ý. Tuy nhiên, tôi không nghĩ rằng tập hợp trong SQL nói đúng là một thao tác được thiết lập. Ngay cả khi nhóm SQL Server coi đó là một hoạt động được thiết lập, mục đích của việc đặt từ 'set' thành chữ hoa là gì?

Trong khi Googling tôi nhận thấy một thông báo lỗi SQL Server:

Table 'T' does not have the identity property. Cannot perform SET operation.

Các từ tương tự 'Thao tác SET' trong cùng một trường hợp ở đây chỉ có thể đề cập đến việc chuyển nhượng IDENTITY_INSERTtài sản, điều này đưa tôi trở lại với suy nghĩ đầu tiên của mình.

Bất cứ ai có thể làm sáng tỏ vấn đề?


Tôi luôn cho rằng nó có nghĩa là hoạt động trên một tập hợp các hàng.
Martin Smith

@MartinSmith Tôi không nghĩ vậy vì SETluôn ở trạng thái đầy đủ như một từ khóa
JNK

@JNK - Có khi nghĩ về nó Tôi cho rằng phải có một số hoạt động không tổng hợp khác đưa ra cảnh báo đó để tôi đoán nếu chúng ta tìm ra điều đó có thể giải thích nó là gì!
Martin Smith

SELECT * FROM sys.messages WHERE text LIKE '%SET operation%'đưa ra 3 kết quả khác mà tất cả dường SETnhư cũng chỉ ra từ khóa.
Martin Smith

Tôi đã thực hiện thêm một số tìm kiếm và nó thực sự có thể đề cập đến các hoạt động thiết lập như trong các bộ toán học. Tôi thấy rất nhiều tài liệu tham khảo trong SS 2k tài liệu để set operationstham khảo UNIONINTERSECTEXCEPT, nhưng tôi không thể nhận được lỗi để đưa ra NULLtrong bất kỳ của những trường hợp này. Tôi nghĩ rằng nó có thể là một thông báo lỗi di sản.
JNK

Câu trả lời:


13

Tôi chỉ xem qua Đặc tả SQL-92 và thấy một đoạn khiến tôi nhớ đến câu hỏi này.

Thực tế, có một cảnh báo theo quy định cho tình huống này như được chỉ ra dưới đây

b) Mặt khác, đặt TX là bảng một cột là kết quả của việc áp dụng <value expression>cho từng hàng T và loại bỏ các giá trị null. Nếu một hoặc nhiều giá trị null bị loại bỏ, thì một điều kiện hoàn thành sẽ được đưa ra: cảnh báo- giá trị null được loại bỏ trong hàm set .

Tôi giả sử rằng SETtrong Thông báo lỗi máy chủ SQL là tham chiếu đến chức năng đã đặt của thông báo lỗi đó mặc dù tôi không chắc tại sao nó lại phân biệt giữa các tập hợp và các hàm tập hợp khác, theo như tôi có thể thấy chúng đồng nghĩa với nhau. Các bit có liên quan của ngữ pháp là dưới đây.

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

9

Câu trả lời nhanh

"SET * khác có thể liên quan đến các phiên bản SQL Server cũ hơn.

Tôi đã từng thấy nó trở lại nhiều hơn khi tôi làm việc với SQL Server 6.5 và 7 Tôi chắc chắn, nhưng đã được một thời gian. Nhiều quirks đã được giải quyết + SQL Server tuân theo các tiêu chuẩn hơn

Lâu hơn:

Ngày nay, thông điệp được kiểm soát theo SET ANSI_WARNINGSmặc định ON.
Điều này hoàn toàn liên quan đến việc

  • một cảnh báo được tạo bởi giá trị NULL trong tổng hợp.
  • cắt ngắn im lặng xảy ra trên chèn / cập nhật cho các trường loại varchar

Một ví dụ:

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;

cho

(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)

Một vi dụ khac:

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

Cá nhân, tôi bỏ qua cảnh báo và để TẮT AN AN_WARNING BẬT vì các hậu quả khác đối với các cột được tính toán và các chế độ xem được lập chỉ mục của việc đặt TẮT.

Cuối cùng, có thể có một cột kích hoạt hoặc cột được tính toán hoặc chế độ xem được lập chỉ mục tạo cảnh báo này ở đâu đó


Phrasing của thông báo lỗi chắc chắn ngụ ý rằng có (hoặc) một số hoạt động không tổng hợp cũng có thể loại bỏ NULL đối với tôi.
Martin Smith

@Martin Smith: đồng ý. Nó có thể là gián tiếp mặc dù theo tuyên bố cuối cùng (mới) của tôi. Hoặc một số chiến lược tối ưu hóa sẽ được nhìn thấy trong kế hoạch
gbn

Thật xấu hổ khi các tài liệu cho mọi thứ cũ hơn SQL Server 7.0 dường như không trực tuyến ở bất cứ đâu.
Martin Smith

1
ví dụ (khó tìm thứ cũ này): kbalertz.com/Feedback.aspx?kbNumber=149921/EN-US
gbn

1
Mặc dù trên thực tế, có vẻ như phiên bản SQL Server 7.0 của tin nhắn chỉ là Cảnh báo: Giá trị Null bị loại khỏi tổng hợp. . Các SET operationbit được không được thêm vào cho đến năm 2000.
Martin Smith

2

Mặt khác của cảnh báo đề cập đến các hoạt động 'set' chứ không phải 'SET' - có vẻ như là một lỗi thông báo đối với tôi - ví dụ: nó cũng được tạo ra với các chức năng cửa sổ:

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.
*/

1
Có vẻ như nó vẫn đề cập đến phần tổng hợp mặc dùMAX()
JNK

Cái đó được gọi là "phần tổng hợp" phải không? Tôi biết ý của bạn tất nhiên, nhưng chúng là các hoạt động khác nhau - ví dụ so sánh select max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;vớiselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
Jack Douglas

2
Đó là hàm tổng hợp :) Tôi tin rằng lỗi đang đề cập đến MAX(). Tôi nghĩ rằng ví dụ thứ hai của bạn phải làm nhiều hơn với thứ tự các thao tác sử dụng các hàm cửa sổ.
JNK

ok - hãy xem ý của bạn từ các tài liệu SS
Jack Douglas
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.