Табличные переменные

Долгое время в SQL сервере в качестве хранения каких-либо промежуточных данных использовались временные таблицы.
Создавались они примерно следующим образом:
create table #t1(tid int,tname nvarchar(80));


Но, начиная с 2005 версии ситуация несколько изменилась.

Появились, так называемые табличные переменные
В чем разница?

Читать дальше →

Присваиваем по-новому

Надо заметить, что синтаксис языков програмирования достиг невиданного прогресса. Если сравнить количество текста и читабельность таких языков как, например, ADA и последняя версия C#, то разница будет разительной. Есть множество языков на все вкусы. Perl мало что пишет, но многое держит в уме. Haskell пишет достаточно, но это мало кому помогает…

К сожалению, SQL вообще и TSQL в частности не могут похвастаться такими же успехами. Долгое время TSQL вообще не развивался. Выходили новые версии сервера, а язык оставался практически тем же. Возьмем простой пример, объявим и присвоим переменную.

declare @var int, @var2 int
set @var = 100
set @var2 = 50

На мой взгляд, это слишком длинно и неудобно. Если в скрипте используется много переменных, то несколько первых экранов будут заняты только их объявлением и присваиванием. Это, согласитесь, каменный век.

Если нужно увеличить переменную на некоторое значение, то нужно писать так:

set @var = @var + 10

Да, старое доброе винрарное присваивание.

Но с выходом SQL Server 2008 ситуация изменилась. Синтаксис языка наконец-то поменялся. Теперь можно не испытывать боли при написании простейших конструкций языка. Теперь можно писать так:

declare @var int = 100,
@var2 int = 50

При иннициализации можно использовать другие переменные (и вообще любые скалярные выражения):

declare @var int = 100
declare @var2 int = @var — 50

А вот в одном declare этого сделать не получится:

declare @var int = 100,
@var2 int = @var — 50

Также был расширен оператор присваивания. Инкремент теперь можно записать так:

set @var += 10

Всего доступно 8 таких операторов: +=, -=, *=, /=, %=, &=, ^=, |=.

Не думаю, что кто-то будет часто пользоваться оператором «двоичное ИЛИ и присвоение», но для полноты языка он есть.

Вспомним, что SELECT на самом деле еще и оператор множественного присваивания. Можем записать так:

select @var *= 2, @var +=1

Вычисления производятся слева направо, и в нашем случае получится 201. Теперь на собеседованиях можно спрашивать такие же дурацкие вопросы, как и у программистов.

Конечно, подобные нововведения нельзя воспринимать без улыбки. Во-первых, уже сто лет как они стали нормой жизни. Они давно есть у конкурентов. Это не более чем синтаксический сахар, а для того чтобы их реализовать ушло чуть не 15 лет. В то же время множество других проблем остались без внимания. Зачем вообще писать set в присваиваниях, у нас все равно переменные выделяются с помощью @? Зачем выделять специальным образом переменные? Да, есть стандарт. Но если стандарт устарел, его нужно поменять… Думаю, еще лет через 15 на очередной конференции Microsoft представит нам новые революционные достижения в синтаксисе SQL. Тогда я напишу еще одну статью.