Я видел вышеупомянутое сообщение «Предупреждение ANSI» сегодня, когда запускал скрипт коллеги (и я не знаю, какое из многих утверждений вызвало вывод предупреждения).
В прошлом я игнорировал это: я сам избегаю нулей, и поэтому все, что могло бы их устранить, - хорошая вещь в моей книге! Однако сегодня слово «SET» буквально выкрикнуло на меня, и я понял, что не знаю, каково значение этого слова в этом контексте.
Моя первая мысль, основанная на том факте, что это верхний регистр, заключается в том, что он ссылается на SET
ключевое слово и означает «назначение», как в
UPDATE <table> SET ...
...ON DELETE SET NULL...
SET IDENTITY_INSERT <table> ON
Согласно справке SQL Server, функция «Предупреждения ANSI» основана на стандарте ISO / ANSI SQL-92, в спецификации которого используется только одно использование термина «Операция Set» в заголовке подраздела, следовательно, в случае заголовка в раздел назначения данных. Однако после быстрого поиска сообщения об ошибке я вижу примеры SELECT
запросов , которые, по- видимому, не связаны с назначением.
Моя вторая мысль, основанная на формулировке предупреждения SQL Server, заключалась в том, что подразумевается математическое значение множества. Тем не менее, я не думаю, что агрегация в SQL, строго говоря, является заданной операцией. Даже если команда SQL Server считает это операцией над множествами, какова цель использования слова «множество» в заглавных буквах?
При поиске я заметил сообщение об ошибке SQL Server:
Table 'T' does not have the identity property. Cannot perform SET operation.
Те же слова «операция SET» в том же случае здесь могут относиться только к назначению IDENTITY_INSERT
свойства, что возвращает меня к моей первой мысли.
Кто-нибудь может пролить свет на этот вопрос?
источник
SET
что всегда в заглавных буквах, как ключевое словоSELECT * FROM sys.messages WHERE text LIKE '%SET operation%'
дает 3 других результата, которые, кажется, все также указываютSET
ключевое слово.set operations
ссылки наUNION
иINTERSECT
иEXCEPT
, но я не могу получить ошибку, чтобы придуматьNULL
ни в одном из этих обстоятельств. Я думаю, что это может быть устаревшее сообщение об ошибке.Ответы:
Я просто просматривал спецификацию SQL-92 и увидел отрывок, который напомнил мне об этом вопросе.
На самом деле, есть предписанное предупреждение для этой ситуации, как указано ниже
Я предполагаю, что
SET
в сообщении об ошибке в SQL Server содержится ссылка на функцию set этого сообщения об ошибке, хотя я не уверен, почему в нем будут различаться агрегаты и другие функции set, насколько я вижу, что они являются синонимами. Соответствующий бит грамматики ниже.источник
Быстрый ответ
«Другой SET *, вероятно, связан с более старыми версиями SQL Server.
Я имел обыкновение видеть это больше, когда я работал с SQL Server 6.5 и 7, я уверен, но это было некоторое время. Многие причуды были устранены + SQL Server больше соответствует стандартам
Longer:
В настоящее время сообщение контролируется по
SET ANSI_WARNINGS
умолчаниюON
.Это относится исключительно к
Один пример:
дает
Другой пример:
Лично я игнорирую предупреждение и оставляю SET ANSI_WARNINGS ON из-за других последствий для вычисляемых столбцов и индексированных представлений установки его OFF.
Наконец, может быть триггер или вычисляемый столбец или индексированное представление, генерирующее это предупреждение где-то
источник
SET operation
Бит не был добавлен до 2000 годаДругая сторона предупреждения относится к операциям 'set', а не к операциям 'SET' - для меня это похоже на сообщение об ошибке - например, оно также создается с помощью оконных функций:
источник
MAX()
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;
MAX()
. Я думаю, что ваш второй пример больше касается порядка операций с использованием оконных функций.