MSSQL - Проверка что в строке только цифры
Пример проверки что в строке толко цифры:
SELECT * FROM my_table WHERE user_name NOT LIKE '%[^0-9]%';
Пример проверки что в строке толко цифры:
SELECT * FROM my_table WHERE user_name NOT LIKE '%[^0-9]%';
Добавление описания к полю в таблице
EXEC sp_addextendedproperty
@name = N'MS_Description',
@value = N'Описание поля',
@level0type = N'SCHEMA', @level0name = N'CRM', -- Вместо 'dbo' ставим название своей схемы если отличается
@level1type = N'TABLE', @level1name = N'TableName', -- Наименование таблицы 'TableName', для поля которой добавляем описание
@level2type = N'COLUMN', @level2name = N'ColumnName'; -- Название поля 'ColumnName', для которого добавляем описание
Примеры получения текста запроса по идентификатору сессии
DECLARE @sqltext VARBINARY(128)
SELECT @sqltext = sql_handle
FROM sys.sysprocesses
WHERE spid = (YourSessionID)
SELECT TEXT
FROM sys.dm_exec_sql_text(@sqltext)
GO
SELECT TEXT
FROM sys.dm_exec_connections
CROSS APPLY sys.dm_exec_sql_text(most_recent_sql_handle)
WHERE session_id = (yoursessionID)
GO
--generate disable деактивация
SELECT 'exec msdb..sp_update_job @job_name = '''+NAME+''', @enabled = 0' FROM msdb..sysjobs
--generate enable активация
SELECT 'exec msdb..sp_update_job @job_name = '''+NAME+''', @enabled = 1' FROM msdb..sysjobs
Ниже приведен пример корректного отмена транзакции при ошибке:
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 останется таким, каким он был установлен в первой строке скрипта до начала транзакции.
Простой пример 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) -- добавление записи
Вот и всё.
Этот запрос возвращает набор полей таблицы со всеми характеристиками. Метод также применим и замечательно работает с представлениями 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 имя_пользователя
Полезный пример изменения кодировки (COLLATION) на уже созданной базе данных.
В данном примере устанавливается русская кодировка: Cyrillic_General_CI_AS
USE master;
GO
-- Переводим БД в single-user mode
ALTER DATABASE [имя_базы_данных]
SET SINGLE_USER WITH ROLLBACK IMMEDIATE
GO
-- Меняем кодировку COLLATION
ALTER DATABASE [имя_базы_данных]
COLLATE Cyrillic_General_CI_AS ;
GO
-- Переводим БД обратно в multi-user mode
ALTER DATABASE [имя_базы_данных]
SET MULTI_USER WITH ROLLBACK IMMEDIATE;
GO
--Проверяем настройки COLLATION.
SELECT name, collation_name
FROM sys.databases
WHERE name = 'имя_базы_данных';
GO
Примр создания последовательности SEQUENCE в MSSQL:
CREATE SEQUENCE [dbo].[CardNum]
AS [bigint]
START WITH 1
INCREMENT BY 1
MINVALUE -9223372036854775808
MAXVALUE 9223372036854775807
CACHE
GO
Этот сккрипт создаст последовательность SEQUENCE CardNum с типом BIGINT и стартовым значением 1 в текущей базе данных.
Чтобы получить новое значение value из последовательности SEQUENCE:
set @card_num = NEXT VALUE FOR [dbo].[CardNum];
Чтобы получить текущие свойства properties для последовательности SEQUENCE:
SELECT * FROM sys.sequences WHERE name = 'CardNum' ;
Для включения возможности использования xp_cmdshell в MSSQL необходимо:
-- Разрешаем изменение дополнительных параметров.
EXEC sp_configure 'show advanced options', 1
GO
-- Обновkztv текущее настроенное значение для дополнительных параметров
RECONFIGURE
GO
-- Включаем cmdshell.
EXEC sp_configure 'xp_cmdshell', 1
GO
-- Обновляем текущее настроенное значение для cmdshell
RECONFIGURE
GO