Обсуждение:Transact-SQL

Текст сохранен из "Transact SQL"

Со страницы, которая раньше была на Transact SQL (теперь перенаправление), скопировано сюда на случай, если это будет полезно:

Расширения (или усовершенствования) Transact-SQL включают язык управления потоком, хранимые процедуры, триггеры, значения по умолчанию, правила, обработку ошибок и набор параметров.

— Саймон 20:03, 15 августа 2005 (UTC) [ ответить ]

"контроль потока"

«Язык управления потоком» звучит неловко, но именно его используют MSDN и Books Online. [1] Давайте придерживаться официальной документации. -- Mikeblas 05:43, 7 января 2006 (UTC) [ ответить ]

Стоит ли добавить немного о хранимых процедурах и функциях? Я думал о чем-то вроде следующего, хотя, если кто-нибудь может проверить меня, это не относится только к ветке MS tsql.

Помимо возможности хранить запросы, хранимые процедуры и функции позволяют обобщать код для лучшего повторного использования и/или ясности. (Между ними есть некоторые различия, хотя их эффекты могут показаться схожими. Например, при вызове процедуры неуказанное значение предполагается значением по умолчанию, если оно есть, в то время как в функциях ключевое слово default должно быть передано явно, чтобы использовать заданное значение по умолчанию.) Функция может использоваться в любом месте, где может находиться таблица в запросе, хотя она должна иметь псевдоним [? может быть неправильно]

Выбирать *Из панели fn_Foo()

Оператор Case — это версия переключателя TSQL, и его можно использовать везде, где может быть выражение SQL. Существует две версии

ВЫБИРАТЬ СЛУЧАЙ @мояПеременная КОГДА 10 ТОГДА ДОБ КОГДА 20 ТОГДА имя КОГДА 30 ТОГДА цель ELSE что-тоЕще КОНЕЦИз tblFoo

Где @myVariable может быть чем угодно, что можно сравнить с элементами между «когда» и «тогда».

и

Выбрать дату рожденияИз tblFooГДЕ цель = СЛУЧАЙ КОГДА (@myVariable = 10) ТОГДА 'обучать' КОГДА (@myOtherVariable =23) ТО «исключить» КОГДА (@myVariable = 20 и @myOtherVariable = 40) ТОГДА «есть» ИНАЧЕ 'ходить' КОНЕЦ

Где каждое выражение между when и then должно оцениваться как true или false. Скобки не нужны.

Приведенные выше примеры CASE не являются управлением потоком и, более того, являются стандартными для SQL99. Хорошо, что их нет на главной странице. Jasen Betts ( обсуждение ) 08:28, 12 февраля 2011 (UTC) [ ответить ]
Есть статьи о функциях и хранимых процедурах; я не вижу, почему мы не можем предоставить упоминание о них здесь и ссылки на другие статьи. Наиболее заметное различие между функциями и хранимыми процедурами заключается в том, что функции оцениваются построчно, в то время как хранимая процедура выполняется один раз. (Я недавно разъяснил это в статье о пользовательских функциях.) Ваше использование CASE не контролирует поток. -- Mikeblas 21:34, 21 июня 2006 (UTC) [ ответить ]

Причина?

”Некоторые считают, что "чтобы сделать его более мощным" — это не совсем истинное намерение Transact-SQL существовать. Причиной может быть привязка к поставщику . О, чушь. —Предыдущий неподписанный комментарий добавлен 18.26.4.40 (обсуждение) 18:04, 14 октября 2008 (UTC) [ ответить ]

Пример «while» не приведен

В разделе "Управление потоком" в конце говорится "Пример цикла WHILE приведен ниже.", но такого примера не приводится. Можно ли это безопасно удалить или кто-то работает над примером? 138.80.0.10 ( обсуждение ) 15:36, 9 апреля 2010 (UTC) [ ответить ]

датачасть

Пример кода DATEPART какой-то уродливый. Как насчет этого:

IF DATENAME(WEEKDAY,CURRENT_TIMESTAMP) IN ('Суббота','Воскресенье') ПЕЧАТАТЬ «Выходные».ЕЩЕ ПЕЧАТАТЬ «Будний день».

Это гораздо более читабельно, чем текущая версия, использующая

ЧАСТЬДАТЫ(dw,ДАТА())

дважды. И так как

ДАТА()

является недетерминированной функцией, возникает неоднозначность относительно того, должны ли два ее вызова возвращать одно и то же значение или нет.

Я не думаю, что ваш пример работает во всех локалях. -- Mikeblas 01:27, 29 июня 2006 (UTC) [ ответить ]

Конечно, вы правы, названия «Суббота» и «Воскресенье» зависят от локали. Но какова цель здесь, проиллюстрировать принцип кодирования управления потоком языка или написать пуленепробиваемый t-sql, чтобы выяснить, выходные это или нет? Существующий пример — довольно запутанный способ проиллюстрировать, что t-sql может это сделать

если @x>1 вывести «Больше», иначе вывести «Меньше»

и выводимый текст также не является прозрачным для локали.

Я считаю, что довольно надежный и независимый от локали фрагмент кода T-SQL для оповещения пользователя о том, что текущая дата является выходной, выглядит следующим образом:
если имя_даты(день_недели,текущая_метка_времени) в (имя_даты(день_недели,'1900-01-06'),имя_даты(день_недели,'1900-01-07')) распечатать случай serverproperty('LCID') когда 1033, то «это выходные». когда 1031, то «Es ist das Wochenende». -- добавьте французский, испанский и т. д. для соответствия пользовательской базе else raiserror('Неизвестная локаль для сообщения.',11,1) конецеще распечатать случай serverproperty('LCID') если 1033, то «Сегодня будний день». когда 1031, то «Es ist ein Wochentag». else raiserror('Неизвестная локаль для сообщения.',11,1) конец

Это вызывает недетерминированную функцию current_timestamp только один раз, поэтому нет двусмысленности относительно возвращаемого значения, и указывает даты выходных в однозначном и предварительно компилируемом формате. Вывод изменяется в соответствии с локалью сервера, а сравнения не зависят от сортировки. (Это тоже шутка.) --Farmhouse121 04:06, 30 июня 2006 (UTC) [ ответить ]

С другой стороны, это энциклопедия, и она должна отражать глобальный взгляд . Ее статьи переведены на разные языки и читаются людьми по всему миру; если такой пользователь читает пример кода, он должен работать там, где он живет. Если это означает, что нам нужно выбрать лучший пример, то я всеми руками за. -- Mikeblas 11:50, 30 июня 2006 (UTC) [ ответить ]

Да, но это английская версия, поэтому я думаю, что на самом деле разумно локализовать примеры для общепринятого английского языка. Я возвращаюсь к своему комментарию, что смысл в том, чтобы проиллюстрировать, как работает язык управления потоком, а не создавать пуленепробиваемый производственный код для реализации третьей стороной. (Причина в том, что пуленепробиваемый код часто не является чистым изложением концепции.) Я чувствую, что последовательность "datepart(dw,date())" и т. д. использует много знаний T-Sql, которые наивный человек не знает. Настоящий вопрос в том, кто читает эту статью и почему? Очевидно, что одна группа читателей — это эксперты T-Sql, изучающие, что есть в Википедии о T-Sql (т. е. это мы). Я бы предположил, что другая, и значительная, группа читателей — это опытные программисты, которые рассматривают это как ресурс для получения сводки возможностей T-Sql, чтобы помочь решить, подходит ли им продукт. Они поймут, что делает оператор "if then", даже если просто сказать "T-Sql обладает IF <LOGICAL-EXPRESSION> <STATEMENT> ELSE <ALTERNATE-STATEMENT>". Что вы думаете? --Farmhouse121 21:41, 3 июля 2006 (UTC) [ ответить ]

Возможно, лучшей альтернативой будет избавиться от datepart(/*args*/) и его локальности, а также выбрать лучший пример. -- Mikeblas 19:33, 5 июля 2006 (UTC) [ ответить ]
Текущий код предполагает (не говоря об этом), что воскресенье настроено как первый день недели. Это настройка для каждого сервера и может меняться. 82.113.133.21 ( talk ) 09:38, 11 апреля 2012 (UTC) [ reply ]

Название статьи

Разве название этой статьи не должно быть T-SQL, как название SQL - SQL , а не Structured Query Language ? -- Стефан Эрварр Сигмундссон ( обсуждение ) 16:08, 16 апреля 2008 (UTC) [ ответить ]

нет пункта из?

Как можно выполнить оператор удаления без предложения from? Это для удаления всей базы данных или что-то в этом роде? Кажется, есть очевидный ответ, но я не могу его придумать. -- 207.235.73.130 (обсуждение) 14:16, 23 сентября 2011 (UTC) [ ответить ]

+1, Изменения в разделах операторов DELETE и UPDATE требуют пояснения. Я никогда не видел DELETE без FROM. И MySQL имеет возможность удалять данные из нескольких таблиц с версии 4.0 (2001-2003). Lacrymocéphale 16:26, 30 сентября 2012 (UTC) [ ответить ]
Я не вижу там ничего о DELETE без предложения FROM, ни сейчас, ни в версии на момент вашего комментария. Но меня озадачивает «оба оператора DELETEи UPDATEдопускают FROMдобавление предложения». Поскольку DELETE в любом случае требует предложения FROM, это может означать только то, что оператор DELETE может принимать два предложения FROM. Но в примере DELETE есть только одно предложение FROM, так о чем же речь? — Smjg ( talk ) 21:39, 26 июля 2019 (UTC) [ reply ]

Даты?

Было бы неплохо указать даты, когда он был выпущен, версии и т. д. -- 86.14.120.74 (обсуждение) 17:15, 21 апреля 2012 (UTC) [ ответить ]

Согласен, на данный момент нет никакой информации об истории. Она должна быть, особенно учитывая ее долгую историю. У меня сложилось впечатление, что T-SQL был создан в то время, когда стандартные операторы SQL выполнялись только по одному за раз, поэтому не существовало никакой предварительной концепции скрипта SQL. Таким образом, произошло последующее расхождение между T-SQL, который просто сопоставлял операторы для выполнения последовательно без разделителя, и стандартным SQL, который ввел точку с запятой в качестве терминатора оператора для поддержки такого скриптинга. В настоящее время эти два языка постепенно возвращаются вместе. Было бы хорошо, если бы мы могли найти какую-то исходную информацию, чтобы включить ее в статью об этом. Может быть, я попробую найти ее, когда у меня будет немного больше времени. — Smjg ( talk ) 11:24, 18 ноября 2022 (UTC) [ ответить ]
Взято с "https://en.wikipedia.org/w/index.php?title=Talk:Transact-SQL&oldid=1171072055"