it-swarm.asia

معنى "SET" في رسالة الخطأ "يتم حذف القيمة الخالية من خلال عملية SET مجمعة أو أخرى"

رأيت رسالة "تحذير ANSI" أعلاه اليوم عند تشغيل نص زميل (ولا أعرف أي من العبارات العديدة تسبب في عرض التحذير).

لقد تجاهلت ذلك في الماضي: أتجنب إهمال نفسي ، وبالتالي فإن أي شيء يزيلها يعد أمرًا جيدًا في كتابي! ومع ذلك ، اليوم صرخ كلمة "SET" حرفيا في وجهي وأدركت أنني لا أعرف ما يفترض أن يكون معنى الكلمة في هذا السياق.

فكرتي الأولى ، استنادًا إلى حقيقة أنها حالة كبيرة ، هي أنها تشير إلى الكلمة الرئيسية SET وتعني "التخصيص" ، كما في

UPDATE <table> SET ...

...ON DELETE SET NULL...

SET IDENTITY_INSERT <table> ON

وفقًا لتعليمات SQL Server ، تعتمد ميزة "تحذيرات ANSI" على ISO/ANSI SQL-92 ، المواصفات التي تستخدم لمصطلح واحد فقط "تعيين عملية" في عنوان القسم الفرعي ، ومن ثم في حالة العنوان ، في قسم تخصيص البيانات. ومع ذلك ، بعد إجراء Googling سريع لرسالة الخطأ ، أرى أمثلة على SELECT طلبات بحث مع عدم وجود تكليف على ما يبدو.

فكرتي الثانية ، بناءً على صياغة تحذير SQL Server ، هي أن المعنى الرياضي للمجموعة ضمني. ومع ذلك ، لا أعتقد أن التجميع في SQL هو عبارة عن عملية محددة بدقة. حتى إذا اعتبرها فريق SQL Server أنها عملية تعيين ، فما هو الغرض من وضع كلمة "set" في العواصم؟

أثناء Googling لاحظت رسالة خطأ SQL Server:

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

يمكن أن تشير نفس الكلمات "عملية التشغيل" في نفس الحالة هنا فقط إلى تعيين IDENTITY_INSERT الملكية ، والتي تعيدني إلى فكرتي الأولى.

يمكن لأي شخص أن يلقي أي ضوء على هذه المسألة؟

18
onedaywhen

كنت أنظر من خلال مواصفات SQL-92 ورأيت فقرة تذكرني بهذا السؤال.

في الواقع هناك تحذير محدد لهذه الحالة كما هو مبين أدناه

ب) وإلا ، فليكن TX جدولاً أحادي العمود ناتج عن تطبيق <value expression> على كل صف من صفوف T وإلغاء القيم الخالية. إذا تم التخلص من قيمة فارغة واحدة أو أكثر ، فسيتم رفع شرط إكمال: تحذير - تم حذف قيمة فارغة في دالة المجموعة .

أفترض أن 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
13
Martin Smith

جواب سريع

من المحتمل أن يكون "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

أنا شخصياً أتجاهل التحذير وأترك ​​SET ANSI_WARNINGS قيد التشغيل بسبب العواقب الأخرى للأعمدة المحسوبة والمشاهدات المفهرسة لإعداده.

أخيرًا ، قد يكون هناك عمود تشغيل أو عرض محسوب أو عرض مفهرس يولد هذا التحذير في مكان ما

9
gbn

يشير الجانب الآخر من التحذير إلى عمليات "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.
*/
2
Jack says try topanswers.xyz