В последние пару недель читал блоги/Books Online и (заново) открыл для себя некоторые "простые" факты, некоторые из которых здорово меня удивили (признаюсь). Некоторые другие всплыли "по ассоциации", в итоге решил поделиться всеми сразу:
- Всем хорошо известен оператор GO, означающий окончание пакета. Так вот, полный синтаксит этого оператора: GO [count] - где count - положительное целое число, указывающее, что предшествующий пакет необходимо выполнить count раз (квадратные скобки указывают, что этот параметр может отсутствовать (что и происходит в ошеломляющем большинстве случаев)).
- Для типа данных datetime определена операция сложения, причем вторым аргументом может быть целое число, которое интерпретируется как количество дней. Так:
DECLARE @D datetime
SET @D = '2009/06/24 15:00'
SET @D = @D + 2
PRINT @D
выдаст 26 июня 2009, 15:00 ... когда я увидел эту запись, то признаться сильно удивился. - Для добавления данных в таблицу можно использовать следующий синтаксис:
INSERT INTO <Имя таблицы> DEFAULT VALUES;
Сработает, конечно, только в том случае, когда для всех полей таблицы, не считая автоинкрементных и timestamp, определены значения по-умолчанию, но все-равно любопытно. - Тип данных timestamp не имеет ничего общего с *nix timestamp (отсчитывающего количество миллисекунд с начала Unix-эры). В SQL Server колонки этого типа данных обновляются автоматически при любых операциях добавления/изменения записи - т.е. это некий аналог "версии строки", за который отвечает сам сервер. Гарантируется уникальность значений полей timestamp в рамках каждой базы данных.
- Переменные не покрываются транзакцией:
DECLARE @i
SET @i = 10
BEGIN TRANSACTION
SET @i = 20
INSERT INTO SomeTable VALUES (@i)
ROLLBACK TRANSACTION
PRINT @i
напечатает 20 (а не 10, как можно было бы ожидать). - Синтаксис ALTER TABLE ... ALTER позволяет изменить определение поля таблицы но не его имя (что можно было бы ожидать). Для переименования необходимо воспользоваться хранимой процедурой sp_rename (не слишком элегантно, но действенно).
HTH,
AlexS