MSSQL - Проверка что в строке только цифры
Пример проверки что в строке толко цифры:
SELECT * FROM my_table WHERE user_name NOT LIKE '%[^0-9]%';
Пример проверки что в строке толко цифры:
SELECT * FROM my_table WHERE user_name NOT LIKE '%[^0-9]%';
Пример применения SPLIT_STRING для всех строк в наборе одним скриптом.
-- Создаем набор данных для примера
declare @tbl table(path varchar(max));
insert into @tbl
select 'root_home_user'
union
select 'lib_var_simple'
union
select 'var_games_user'
--Теперь выбираем для каждой записи второе значение в строке с учетом разделителя "_"
select
path,
s.value -- Здесь будет результат SPLIT_STRING для каждого поля
from @tbl
CROSS APPLY
STRING_SPLIT(path, '_') AS s -- Замените '_' на ваш разделитель
WHERE
s.value = (SELECT value FROM STRING_SPLIT(path, '_')
ORDER BY (SELECT NULL) OFFSET 1 ROW FETCH NEXT 1 ROW ONLY)
-- Для выбора какой из параметров по порядку взять, меняем OFFSET - 0 - первый и далее.
Пример возвращения параметра при выполнении динамически созданного запроса.
Будем использовать для этого sp_executesql
DECLARE @eventCount as int = 0; -- Наш возвращаемый параметр
DECLARE @sqlString AS NVARCHAR(500); -- Динамически сгенерированный SQL скрипт
DECLARE @parmDefinition AS NVARCHAR(500); -- Набор параметров для обмена
DECLARE @actualDate as date = '2000-08-24';
DECLARE @tableName as varchar(max) = 'sys.tables';
SET @parmDefinition = N'@outputCount int OUTPUT,@DateSend date';
SET @sqlString = N'select @outputCount = count(1) from '+@tableName+' where create_date>@dateSend;';
EXEC sp_executesql
@stmt = @sqlString, -- Динамически созданный запрос
@params = @parmDefinition, -- Описание передаваемых параметров (как в запрос так и обратно)
@dateSend = @actualDate, -- Принимаемый параметр
@outputCount = @eventCount OUTPUT; -- Возвращаемый параметр
SELECT @eventCount AS CountEvents;
IN
select * from Rating
where ID_PLAYER in (
select ID_PLAYER from Players where PLAYER_STATUS = 'Active'
);
EXISTS
select * from Rating r
where exists (
select 1 from Players p
where p.ID_PLAYER = r.ID_PLAYER and p.PLAYER_STATUS = 'Active'
);
Добавление описания к полю в таблице
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
Пример выборки полей из временной таблицы со всеми параметрами.
Идентично можно выбирать и для обычных таблиц.
Select c.column_id
,c.name [column_name]
,y.name [data_type]
,c.max_length
,c.precision
,c.scale
,c.is_identity
,c.is_nullable
,c.collation_name
,', ['+c.name +'] ['+y.name+']'
+IIF (y.name in ('varchar','char'),'('+cast(IIF(c.max_length=0,'max',c.max_length) as varchar(5))+')','')
+IIF (y.name in ('nvarchar'),'('+cast(IIF(c.max_length=0,'max',c.max_length/2) as varchar(5))+')','')
+IIF (y.name in ('decimal','numeric'),'('+cast(c.precision as varchar(3))+', '+cast(c.scale as varchar(3))+')','')
+IIF (not y.collation_name is null,' COLLATE '+y.collation_name,'')
+IIF (y.is_nullable = 1,' NULL','')
as [ready_column]
From tempdb.sys.columns c
Inner join sys.types y ON y.system_type_id = c.system_type_id
WHERE c.object_id = Object_id('tempdb..#tmp')
and y.name!='sysname'
order by c.column_id
#tmp - ваша временная таблица
Ниже приведен пример корректного отмена транзакции при ошибке:
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) -- добавление записи
Вот и всё.
Не так давно наткнулся на очень полезный ресурс для всех разработчиков приложений для работы с базами данных, называется ресурс Connection Strings.
Ресурс представляет собой сборку всевозможных строк подключения к самым различным базам данных с использованием самых разнообразный провайдеров и технологий.
Ну просто очень полезный ресурс.
Вот ссылка: http://www.connectionstrings.com
Ресурс правда на английском, но для тех кому надо это я полагаю не проблема.