ความหมายของ 'SET' ในข้อความแสดงข้อผิดพลาด 'ค่า Null ถูกลบโดยการรวมหรือการดำเนินการ SET อื่น ๆ '


18

ฉันเห็นข้อความ 'คำเตือน ANSI' ข้างต้นวันนี้เมื่อเรียกใช้สคริปต์ของเพื่อนร่วมงาน (และฉันไม่ทราบว่าคำสั่งใดในหลาย ๆ คำที่ทำให้คำเตือนปรากฏขึ้น)

ในอดีตที่ผ่านมาฉันไม่สนใจ: ฉันหลีกเลี่ยงโมฆะตัวเองและดังนั้นสิ่งที่จะกำจัดพวกเขาเป็นสิ่งที่ดีในหนังสือของฉัน! อย่างไรก็ตามวันนี้คำว่า 'SET' ตะโกนออกมาอย่างแท้จริงและฉันก็รู้ว่าฉันไม่รู้ความหมายของคำว่าควรจะอยู่ในบริบทนี้

ความคิดแรกของฉันขึ้นอยู่กับความจริงมันเป็นตัวพิมพ์ใหญ่คือมันหมายถึงSETคำหลักและหมายถึง 'การมอบหมาย' ใน

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

ตามความช่วยเหลือของเซิร์ฟเวอร์ SQL คุณลักษณะ 'คำเตือนของ ANSI' จะขึ้นอยู่กับ ISO / ANSI SQL-92 ข้อมูลจำเพาะที่ใช้คำว่า 'ตั้งค่าการดำเนินงาน' เพียงครั้งเดียวในหัวข้อย่อยดังนั้นในกรณีหัวเรื่องใน ส่วนการกำหนดข้อมูล อย่างไรก็ตามหลังจาก Googling อย่างรวดเร็วของข้อความแสดงข้อผิดพลาดฉันเห็นตัวอย่างที่เป็นSELECTแบบสอบถามที่ดูเหมือนจะไม่มีการมอบหมายที่เกี่ยวข้อง

ความคิดที่สองของฉันซึ่งขึ้นอยู่กับถ้อยคำของคำเตือน SQL Server คือความหมายทางคณิตศาสตร์ของชุดนั้นเป็นนัย อย่างไรก็ตามฉันไม่คิดว่าการรวมใน SQL จะพูดถึงการดำเนินการที่กำหนดไว้อย่างเคร่งครัด แม้ว่าทีม SQL Server จะพิจารณาว่าเป็นการดำเนินการชุดวัตถุประสงค์ของการวางคำว่า 'ชุด' ในเมืองหลวงคืออะไร?

ในขณะที่ Googling ฉันสังเกตเห็นข้อความแสดงข้อผิดพลาด SQL Server:

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

คำว่า 'การดำเนินงาน SET' คำเดียวกันในกรณีเดียวกันที่นี่สามารถอ้างถึงการมอบหมายของIDENTITY_INSERTทรัพย์สินซึ่งทำให้ฉันกลับไปที่ความคิดแรกของฉัน

ใครสามารถฉายแสงในเรื่องนี้ได้บ้าง?


ฉันคิดเสมอว่ามันหมายถึงการดำเนินการในชุดของแถว
Martin Smith

@MartinSmith ฉันไม่คิดอย่างนั้นตั้งแต่SETอยู่ในตัวพิมพ์ใหญ่แบบเต็มเสมอเช่นคำหลัก
JNK

@JNK - ใช่ในการคิดเกี่ยวกับมันฉันคิดว่าจะต้องมีการดำเนินการโดยรวมอื่น ๆ ที่ยกคำเตือนนั้นดังนั้นฉันเดาว่าถ้าเราพบสิ่งที่มันอาจอธิบายได้!
Martin Smith

SELECT * FROM sys.messages WHERE text LIKE '%SET operation%'ให้ผลลัพธ์อื่นอีก 3 รายการที่ดูเหมือนจะบ่งบอกถึงSETคำหลักเช่นกัน
Martin Smith

ฉันทำการค้นหาเพิ่มเติมและอาจหมายถึงการตั้งค่าการดำเนินการเช่นเดียวกับในชุดคณิตศาสตร์ ฉันพบการอ้างอิงจำนวนมากในเอกสาร SS 2k เพื่อset operationsอ้างถึงUNIONและINTERSECTและEXCEPTแต่ฉันไม่สามารถรับข้อผิดพลาดได้NULLในทุกกรณี ฉันคิดว่าอาจเป็นข้อความแสดงข้อผิดพลาดเดิม
JNK

คำตอบ:


13

ฉันเพิ่งดูข้อมูลจำเพาะของ SQL-92และเห็นข้อความที่ทำให้ฉันนึกถึงคำถามนี้

ในความเป็นจริงมีคำเตือนที่กำหนดสำหรับสถานการณ์นี้ตามที่ระบุไว้ด้านล่าง

b) มิฉะนั้นให้ TX เป็นตารางคอลัมน์เดี่ยวที่เป็นผลลัพธ์ของการใช้<value expression>กับแต่ละแถวของ T และกำจัดค่า Null หากหนึ่งหรือมากกว่าค่า null จะถูกตัดออกแล้วสภาพเสร็จจะเพิ่มขึ้น: ค่า null คำเตือนกำจัดในฟังก์ชั่นชุด

ฉันคิดว่าSETใน SQL Server Error Message เป็นการอ้างอิงถึงฟังก์ชันชุดของข้อความแสดงข้อผิดพลาดนั้นถึงแม้ว่าฉันไม่แน่ใจว่าทำไมมันจะสร้างความแตกต่างระหว่างมวลรวมและฟังก์ชันชุดอื่น ๆ เท่าที่ฉันเห็นพวกเขามีความหมายเหมือนกัน บิตที่เกี่ยวข้องของไวยากรณ์อยู่ด้านล่าง

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

คำตอบที่รวดเร็ว

SET อื่น ๆ อาจเกี่ยวข้องกับ SQL Server เวอร์ชั่นที่เก่ากว่า

ฉันเคยเห็นมันอีกครั้งเมื่อฉันทำงานกับ SQL Server 6.5 และ 7 ฉันแน่ใจ แต่มันก็มีเวลา นิสัยใจคอหลายอย่างได้ถูกยกเลิก + SQL Server เป็นไปตามมาตรฐานมากขึ้น

อีกต่อไป:

ปัจจุบันข้อความจะถูกควบคุมโดยที่เริ่มต้นที่SET ANSI_WARNINGS เรื่องนี้เกี่ยวข้องกับว่าON

  • คำเตือนถูกสร้างขึ้นโดยค่า NULL ในการรวม
  • Truncation แบบเงียบเกิดขึ้นกับส่วนแทรก / อัพเดตสำหรับฟิลด์ประเภท 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

โดยส่วนตัวแล้วฉันไม่สนใจคำเตือนและเปิด SET ANSI_WARNINGS ไว้เนื่องจากผลกระทบอื่น ๆ ต่อคอลัมน์จากการคำนวณและมุมมองที่จัดทำดัชนีไว้ของการตั้งค่าปิด

ในที่สุดอาจมีทริกเกอร์หรือคอลัมน์ที่คำนวณหรือดูดัชนีที่สร้างคำเตือนนี้ที่ไหนสักแห่ง


การใช้ข้อความแสดงข้อผิดพลาดแสดงให้เห็นว่ามีการดำเนินการโดยรวม (หรือ) บางอย่างที่สามารถกำจัด NULL ให้ฉันได้
Martin Smith

@Martin Smith: เห็นด้วย อาจเป็นทางอ้อมแม้ว่าตามคำสั่งสุดท้ายของฉัน (ใหม่) หรือบางกลยุทธ์การเพิ่มประสิทธิภาพที่จะเห็นในแผน
GBN

น่าเสียดายที่เอกสารสำหรับสิ่งใดก็ตามที่เก่ากว่า SQL Server 7.0 ดูเหมือนจะไม่ได้ออนไลน์ทุกที่
Martin Smith

1
ตัวอย่าง (ยากที่จะค้นหาสิ่งที่เก่า): kbalertz.com/Feedback.aspx?kbNumber=149921/EN-US
gbn

1
แม้ว่าจริง ๆ แล้วมันดูเหมือนว่าข้อความของ SQL Server 7.0 รุ่นเป็นเพียงคำเตือน: ค่า Null ถูกตัดออกจากการรวม . SET operationบิตไม่ได้ถูกเพิ่มจนถึงปี 2000
มาร์ตินสมิ ธ

2

อีกด้านหนึ่งของคำเตือนหมายถึงการดำเนินการ '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.
*/

1
ดูเหมือนว่ามันยังคงหมายถึงส่วนหนึ่งรวมแม้ว่าMAX()
JNK

นั่นเรียกว่า 'ส่วนการรวมตัว' หรือไม่? ฉันรู้ว่าสิ่งที่คุณหมายถึงแน่นอน แต่พวกเขามีการดำเนินงานที่แตกต่างกัน - เช่นเปรียบเทียบselect max(foo) from (values (1), (2), (null)) as t(foo) where 1=2;กับselect max(foo) over() from (values (1), (2), (null)) as t(foo) where 1=2;
แจ็คดักลาส

2
มันเป็นฟังก์ชั่นรวม :) MAX()ผมเชื่อว่าข้อผิดพลาดจะหมายถึง ฉันคิดว่าตัวอย่างที่สองของคุณต้องทำมากขึ้นด้วยลำดับการทำงานโดยใช้ฟังก์ชั่นหน้าต่าง
JNK

ตกลง - ดูว่าคุณหมายถึงอะไรจากเอกสาร SS
แจ็คดักลาส
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.