среда, 24 июня 2009 г.

T-SQL Simple Facts

В последние пару недель читал блоги/Books Online и (заново) открыл для себя некоторые "простые" факты, некоторые из которых здорово меня удивили (признаюсь). Некоторые другие всплыли "по ассоциации", в итоге решил поделиться всеми сразу:

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

HTH,

AlexS