त्रुटि संदेश में 'सेट' का अर्थ 'सकल मूल्य एक समग्र या अन्य सेट ऑपरेशन द्वारा समाप्त हो गया है'


18

मैंने सहकर्मी की स्क्रिप्ट चलाते समय उपरोक्त 'एएनएसआई चेतावनी' संदेश आज देखा (और मुझे नहीं पता कि कई बयानों के कारण चेतावनी दिखाई गई थी)।

अतीत में मैंने इसे नजरअंदाज कर दिया था: मैं खुद को अशक्त करने से बचता हूं और ऐसा कुछ भी जो उन्हें खत्म कर देगा, मेरी किताब में एक अच्छी बात है! हालाँकि, आज शब्द 'सेट' का शाब्दिक अर्थ मुझ पर चिल्लाया और मैंने महसूस किया कि मुझे नहीं पता कि इस संदर्भ में शब्द का अर्थ क्या माना जाता है।

इस तथ्य के आधार पर मेरा पहला विचार, यह ऊपरी मामला है, यह है कि यह SETकीवर्ड और 'असाइनमेंट' का अर्थ है, जैसे कि

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

SQL सर्वर हेल्प के अनुसार, 'ANSI चेतावनियाँ' सुविधा ISO / ANSI SQL-92 पर आधारित है, जिसके लिए युक्ति उप-शीर्षक में 'सेट ऑपरेशन' शब्द का सिर्फ एक उपयोग करती है, इसलिए शीर्षक मामले में, डेटा असाइनमेंट अनुभाग। हालाँकि, त्रुटि संदेश के त्वरित Googling के बाद, मुझे ऐसे उदाहरण दिखाई देते हैं, जिनमें SELECTकोई असाइनमेंट शामिल नहीं है।

SQL सर्वर चेतावनी के शब्दांकन के आधार पर मेरा दूसरा विचार यह था कि सेट का गणितीय अर्थ निहित है। हालाँकि, मुझे नहीं लगता कि SQL में एकत्रीकरण कड़ाई से एक सेट ऑपरेशन बोल रहा है। यहां तक ​​कि अगर SQL सर्वर टीम इसे एक सेट ऑपरेशन मानती है, तो राजधानियों में 'सेट' शब्द डालने का क्या उद्देश्य है?

Googling के दौरान मैंने SQL सर्वर त्रुटि संदेश देखा:

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

यहां एक ही मामले में 'सेट ऑपरेशन' शब्द केवल IDENTITY_INSERTसंपत्ति के असाइनमेंट को संदर्भित कर सकता है, जो मुझे मेरे पहले विचार पर वापस लाता है।

क्या कोई इस मामले पर कोई प्रकाश डाल सकता है?


मैंने हमेशा यह माना कि पंक्तियों के सेट पर इसका मतलब होता है।
मार्टिन स्मिथ

@MartinSmith मुझे ऐसा नहीं लगता क्योंकि SETहमेशा एक कीवर्ड की तरह पूरे कैप में रहता है
JNK

@ जेएनके - हां, इसके बारे में सोचने पर मुझे लगता है कि कोई अन्य गैर-समुच्चय ऑपरेशन होना चाहिए जो उस चेतावनी को उठाता है इसलिए मुझे लगता है कि अगर हमें पता चलता है कि यह क्या है तो इसे समझाएं!
मार्टिन स्मिथ

SELECT * FROM sys.messages WHERE text LIKE '%SET operation%'3 अन्य परिणाम देता है जो सभी SETकीवर्ड को इंगित करते हैं ।
मार्टिन स्मिथ

मैंने कुछ और खोज की और यह वास्तव में गणितीय सेट के रूप में संचालन निर्धारित करने की बात कर सकता है। मैं करने के लिए 2k डॉक्स एसएस में संदर्भ का एक बहुत पाया set operationsकी चर्चा करते हुए UNIONऔर INTERSECTऔर EXCEPT, लेकिन मैं त्रुटि के साथ आने के लिए नहीं मिल सकता है NULLउन परिस्थितियों में से किसी में। मुझे लगता है कि यह एक विरासत त्रुटि संदेश हो सकता है।
जेएनके

जवाबों:


13

मैं एसक्यूएल -92 विनिर्देशन के माध्यम से देख रहा था और एक मार्ग देखा, जिसने मुझे इस प्रश्न की याद दिला दी।

इस स्थिति के लिए वास्तव में निर्धारित चेतावनी है जैसा कि नीचे बताया गया है

ख) अन्यथा, TX एकल-स्तंभ तालिका है जो <value expression>T की प्रत्येक पंक्ति पर लागू होने और अशक्त मानों को समाप्त करने का परिणाम है । यदि एक या एक से अधिक अशक्त मानों को समाप्त कर दिया जाता है, तो एक पूरा होने की स्थिति खड़ी हो जाती है : चेतावनी-शून्य मान सेट फ़ंक्शन में समाप्त हो जाता है

मुझे लगता है कि SETSQL सर्वर त्रुटि संदेश में उस त्रुटि संदेश के सेट फ़ंक्शन का एक संदर्भ है, हालांकि मुझे यकीन नहीं है कि यह समुच्चय और अन्य सेट कार्यों के बीच एक अंतर बना देगा, जहां तक ​​मैं देख सकता हूं कि वे समानार्थी हैं। व्याकरण की प्रासंगिक बिट नीचे है।

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

शीघ्र जवाब

"अन्य सेट * संभवतः पुराने SQL सर्वर संस्करणों से संबंधित है।

जब मैं SQL Server 6.5 और 7 के साथ काम करता हूं तो मैं इसे और अधिक वापस देखता था, मुझे यकीन है, लेकिन यह कुछ समय रहा है। कई quirks बाहर निकाल दिया गया है + SQL सर्वर मानकों का अधिक पालन करता है

लंबे समय तक:

आजकल, संदेश को नियंत्रित किया जाता है SET ANSI_WARNINGSजिसके द्वारा चूक होती है ON
यह विशुद्ध रूप से संबंधित है कि क्या

  • एक कुल में एक NULL मान से एक चेतावनी उत्पन्न होती है।
  • मौन ट्रंकेशन varchar type फ़ील्ड के लिए इन्सर्ट / अपडेट पर होता है

एक उदाहरण:

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 को भी समाप्त कर सकता है)।
मार्टिन स्मिथ

@ मर्टिन स्मिथ: सहमत हैं। यह अप्रत्यक्ष हो सकता है, हालांकि मेरे (नए) अंतिम कथन के अनुसार। या कुछ आशावादी रणनीति जो योजना में दिखाई देगी
gbn

शर्म की बात है कि SQL Server 7.0 से अधिक पुरानी किसी भी चीज़ के लिए डॉक्स कहीं भी ऑनलाइन नहीं लगते हैं।
मार्टिन स्मिथ

1
उदाहरण (इस पुराने सामान को ढूंढना मुश्किल): kbalertz.com/Feedback.aspx?kbNumber=149921/EN-US
gbn

1
यद्यपि वास्तव में ऐसा लगता है कि संदेश का SQL Server 7.0 संस्करण सिर्फ चेतावनी था : कुल से समाप्त हो गया शून्य मान। SET operationबिट नहीं जोड़ा गया था 2000 तक
मार्टिन स्मिथ

2

चेतावनी का दूसरा पक्ष 'सेट' ऑपरेशनों को संदर्भित करता है न कि 'सेट' संचालन - जो मुझे संदेश बग जैसा लगता है - उदाहरण के लिए यह विंडोिंग फ़ंक्शन के साथ भी निर्मित होता है:

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()। मुझे लगता है कि आपको विंडो कार्यों का उपयोग करके संचालन के आदेश के साथ दूसरा उदाहरण देना होगा।
जेएनके

ठीक है - एसएस डॉक्स से आपका क्या मतलब है
जैक डगलस
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.