Долгое время в 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. Тогда я напишу еще одну статью.