Добавление записей в таблицу с первичным ключом MSSQL (T-SQL)

Как добавить в таблицу данные с Primary Key (когда надо этот первичный ключ игнорировать)

SET IDENTITY_INSERT tableA ON

-- Теперь можно делать список полей с  Primary Key и добавлять записи так:

INSERT Into tableA ([id], [c2], [c3], [c4], [c5] ) 
SELECT [id], [c2], [c3], [c4], [c5] FROM tableB

-- Вот так нельзя "INSERT Into tableA SELECT ........"

SET IDENTITY_INSERT tableA OFF


Подробнее

MSSQL - Try Catch Transaction (Отменяем транзакцию с ошибкой корректно)

Ниже приведен пример корректного отмена транзакции при ошибке:

update Params set Value=168 where Param = 'SessionHoursLimit'

PRINT @@TRANCOUNT  
	BEGIN TRY
    BEGIN TRAN  
        PRINT @@TRANCOUNT  
		update Params set Value=167 where Param = 'SessionHoursLimit'
		select 1/0 -- Если закомментировать эту строку то предыдущая строка выполнится
    COMMIT  TRAN 
	END TRY
	BEGIN CATCH
		if @@TRANCOUNT>0
		ROLLBACK TRAN
	END CATCH
PRINT @@TRANCOUNT  

select * from Params



Если закомментировать строку с ошибочным оператором SELECT 1/0 то предшествующая строка будет выполнена и транзакция успешно завершится, если оставить строку SELECT 1/0 то транзакция отменится полностью, и параметр Value останется таким, каким он был установлен в первой строке скрипта до начала транзакции.

Подробнее

Чистка логов базы данных MSSQL

Вообще процесс чистки логов должен проходить планово, и следить за этим и настраивать должен профессиональный админ. Однако бывает так что на вашем казалось бы небольшом девелоперском проекте для тестов логи неожиданно превысили установленный размер и возникла следующая проблема:

Сама проблема:

The transaction log for database 'база_данных' is full due to 'LOG_BACKUP'. 


Проблему разумеется надо решать.

И вот как это делается:

Для обрезки лога используется вот эта команда:

DBCC SHRINKFILE(база_данных_log, 100);


При выполнении этой команды, LOG файл будет обрезан до 100 мегабайт.

Подробнее

Пример MERGE в MSSQL T-SQL

Простой пример MERGE для TSQL.

В примере подразумевается, что мы оперируем двумя одинаковыми по структуре таблицами (в реальной жизни это условие вовсе не обязательно).
Таблицы TargetTableи SourceTable — состоят всего из двух полей:
Id — некий идентификатор.
Name — Название объекта.

В примере ниже мы проверяем для всех записей из SourceTable — существует ли в таблице TargetTable запись с аналогичным Id и если существует, то меняем для этой записи поле Name в TargetTable, а если не существует то добавляем запись в TargetTable из SourceTable целиком.


MERGE TargetTable AS target  -- таблица которую будем менять, таблица приемник

USING (SELECT Id, Name FROM SourceTable) AS source 

ON (target.Id = source.Id)  -- условие по которому сопоставляем источник и приемник

WHEN MATCHED AND target.Name!=source.Name -- Если такой уже есть, то проверяем не совпадает ли Name и если не совпадает то меняем

    THEN UPDATE SET target.Name = source.Name -- обновляем

WHEN NOT MATCHED  -- если такого Id нет в таблице target то добавляем

    THEN INSERT VALUES(source.Id, source.Name) -- добавление записи



Вот и всё.

Подробнее

Выборка длинных строк в MSSQL Manager

По умолчанию в MSSQL-Manager длинна строки в выборки ограничена, и при достаточно большом размере строки в выборку попадет только её часть, но есть способ обойти этот изъян.
Чтобы выбрать длинную строку, достаточно просто назначить имя на поле с названием [XML_F52E2B61-18A1-11d1-B105-00805F49916B].

Например:

select [Полк_с_длинным_varchar_max] as [XML_F52E2B61-18A1-11d1-B105-00805F49916B] from 
[dbo].[Таблица] 
Подробнее

Получение полей таблицы в MSSQL - TSQL

Этот запрос возвращает набор полей таблицы со всеми характеристиками. Метод также применим и замечательно работает с представлениями VIEW.

SELECT 
   ORDINAL_POSITION
  ,COLUMN_NAME
  ,DATA_TYPE
  ,CHARACTER_MAXIMUM_LENGTH
  ,IS_NULLABLE
  ,COLUMN_DEFAULT
FROM   
  INFORMATION_SCHEMA.COLUMNS 
WHERE   
  TABLE_NAME = 'Название таблицы' 
ORDER BY 
  ORDINAL_POSITION ASC; 


А вот так можно узнать права пользователя.

sp_HelpUser имя_пользователя
Подробнее

Удаление временных таблиц в MSSQL

Иногда возникает необходимость, в ходе работы процедуры, удалить временно созданную таблицу которая может быть либо создана либо нет, тогда не достаточно просто написать например drop table #myTempTable — потому что в случае если таблицы не существует то запрос не выполнится и выдаст ошибку. Пример ниже показывает как правильно удалять временные таблицы в таком случае:

if exists (
	select * from tempdb.dbo.sysobjects o
	where o.xtype in ('U') 

	and o.id = object_id(N'tempdb..#myTempTable')
)
BEGIN
  DROP TABLE #myTempTable; 
END
Подробнее

MSSQL Оконные функции - Пример ROWNUMBER OVER PARTITION BY

Оконные функции — это такие функции которые на основе окна (набора записей) вычисляют скалярное (одиночное) значение. Это значение определяется с помощью инструкции OVER.

Пример:

select regioncode, aolevel, offname,
 row_number() over(partition by regioncode order by aolevel, offname) as rownum
 from s_adr_fias
order by regioncode, aolevel, offname;



В данном примере будет сделана выборка в которой для каждого regioncode в поле rownum будет нумерация отсортированных значений aolevel, offname.

Подробнее