Статьи

Полезные SQL-запросы и проекты

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

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

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

и многое другое бизнес-сценарий. Мы потратили время на такие оперативные работы. Я думаю, что это проблема. Мы не должны тратить время на это. Что мы можем сделать, чтобы решить эту проблему? Давайте посмотрим:

  • Мы можем разработать консольные приложения для конкретных ежегодных и ежемесячных работ по базе данных.
  • Мы можем подготовить сценарии для ежедневных работ по базе данных
  • Мы можем использовать существующий плагин или программы. Например; Бесплатные  инструменты  фирмы  Redgate находятся здесь
  • Мы можем разработать веб-приложение или приложение для Windows, которое мы используем во всех работах с базами данных. Вы можете эффективно использовать  MS Sql сервер SMO kütüphane

Теперь мы рассмотрим примеры хранимых процедур, запросов и проектов по пунктам ниже. Кстати, я написал хранимые процедуры, запросы и проекты (C #) с transact-sql.

Сценарии

1 —  Search.sql

Вы увидите выбранные запросы, которые вы используете для поиска текста в объектах базы данных (хранимая процедура, триггер, функция…). Мы используем системные таблицы для поиска ниже, и я должен просмотреть системные таблицы (действительно полезный запрос).

-- database object contents
SELECT * FROM sys.syscomments(NOLOCK)

-- For schema names of tables
SELECT * FROM sys.schemas(NOLOCK)

-- All database objects' names
SELECT * FROM sys.all_objects(NOLOCK)

-- main select query
SELECT  S.name AS SP_SCHEMA,
        O.name AS SP_NAME,
        C.text AS SP_TEXT
FROM sys.syscomments(NOLOCK) AS C
    JOIN sys.all_objects(NOLOCK) AS O
        ON C.id = O.object_id
    JOIN sys.schemas AS S
        ON S.schema_id = O.schema_id
WHERE O.type in ('P','FN','IF','FS','AF','X','TF','TR','PC') AND
      C.text like '%' + 'ARANACAK KELIME' + '%'

2-   Nested_Search.sql

T-SQL скрипт для вложенного поиска. Вы можете легко создать хранимую процедуру для этого:

DECLARE @text1 VARCHAR(MAX),
        @text2 VARCHAR(MAX),
        @text3 VARCHAR(MAX),
        @text4 VARCHAR(MAX),
        @text5 VARCHAR(MAX),
        @dbname VARCHAR(64)

SET @dbname='DB_NAME'
SET @text1='TEXT1_TO_SEARCH'
SET @text2='TEXT2_TO_SEARCH'
SET @text3='TEXT3_TO_SEARCH'
SET @text4='TEXT4_TO_SEARCH'
SET @text5='TEXT5_TO_SEARCH'

DECLARE @sql VARCHAR(MAX)
SELECT @sql = ''

SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('
SELECT @sql = @sql + 'SELECT * FROM ('

select @sql = @sql + 'SELECT ''' + @dbname + ''' AS db, o.name,m.definition '
select @sql = @sql + ' FROM '+@dbname+'.sys.sql_modules m '
select @sql = @sql + ' INNER JOIN '+@dbname+'..sysobjects o on m.object_id=o.id'
select @sql = @sql + ' WHERE [definition] LIKE ''%'+@text1+'%'''

SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text2+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text3+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text4+'%'''
SELECT @sql = @sql + ' ) X WHERE [definition] LIKE ''%'+@text5+'%'''

--PRINT @sql
execute (@sql)

3-  OpenTransactionListingAndKill.sql

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

SELECT  L.request_session_id AS SPID,
DB_NAME(L.resource_database_id) AS DatabaseName,
O.Name AS LockedObjectName,
P.object_id AS LockedObjectId,
L.resource_type AS LockedResource,
L.request_mode AS LockType,
ST.text AS SqlStatementText,
ES.login_name AS LoginName,
ES.host_name AS HostName,
TST.is_user_transaction as IsUserTransaction,
AT.name as TransactionName,
CN.auth_scheme as AuthenticationMethod
FROM     sys.dm_tran_locks L
JOIN sys.partitions P ON P.hobt_id = L.resource_associated_entity_id
JOIN sys.objects O ON O.object_id = P.object_id
JOIN sys.dm_exec_sessions ES ON ES.session_id = L.request_session_id
JOIN sys.dm_tran_session_transactions TST ON ES.session_id = TST.session_id
JOIN sys.dm_tran_active_transactions AT ON TST.transaction_id = AT.transaction_id
JOIN sys.dm_exec_connections CN ON CN.session_id = ES.session_id
CROSS APPLY sys.dm_exec_sql_text(CN.most_recent_sql_handle) AS ST
WHERE   resource_database_id = db_id()
ORDER BY L.request_session_id

-- We get KILL to open transaction with SPID

--KILL SPID

4-   INSERT.sql

Эта хранимая процедура подготавливает операторы INSERT INTO для данных, которые вы вставили в таблицу. Это действительно практичная хранимая процедура, когда вам нужно развернуть данные в базе данных разных сред. Вы также найдете его ниже:

GO
/****** Object:  StoredProcedure [dbo].[INSERT]    Script Date:  ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
--drop proc [dbo].[INSERT]

CREATE procedure  [dbo].[INSERT]
(
   @Query  Varchar(MAX)
)

AS

SET nocount ON

DECLARE @WithStrINdex AS INT
DECLARE @WHEREStrINdex AS INT
DECLARE @INDExtouse AS INT

DECLARE @SchemaANDTAble VArchar(270)
DECLARE @Schema_name  varchar(30)
DECLARE @Table_name  varchar(240)
DECLARE @Condition  Varchar(MAX)

SET @WithStrINdex=0

SELECT @WithStrINdex=CHARINDEX('With',@Query )
, @WHEREStrINdex=CHARINDEX('WHERE', @Query)

IF(@WithStrINdex!=0)
SELECT @INDExtouse=@WithStrINdex
ELSE
SELECT @INDExtouse=@WHEREStrINdex

SELECT @SchemaANDTAble=LEFT (@Query,@INDExtouse-1)
SELECT @SchemaANDTAble=LTRIM (RTRIM( @SchemaANDTAble))

SELECT @Schema_name= LEFT (@SchemaANDTAble, CharINdex('.',@SchemaANDTAble )-1)
,      @Table_name = SUBSTRING(  @SchemaANDTAble , CharINdex('.',@SchemaANDTAble )+1,LEN(@SchemaANDTAble) )

,      @Condition=SUBSTRING(@Query,@WHEREStrINdex+6,LEN(@Query))--27+6

DECLARE   @COLUMNS  table (Row_number SmallINT , Column_Name VArchar(Max) )
DECLARE @CONDITIONS AS varchar(MAX)
DECLARE @Total_Rows AS SmallINT
DECLARE @Counter AS SmallINT

DECLARE @ComaCol AS varchar(MAX)
SELECT @ComaCol=''

SET @Counter=1
SET @CONDITIONS=''

INsert INTO @COLUMNS
SELECT  Row_number()Over (Order by ORDINAL_POSITION ) [Count] ,Column_Name FROM INFORMATION_SCHEMA.columns WHERE Table_schema=@Schema_name
AND table_name=@Table_name
AND Column_Name NOT IN ('FTP_PASSWORD','FTP_ENCRYPTED_PASSWORD')

SELECT @Total_Rows= Count(1) FROM  @COLUMNS

             SELECT @Table_name= '['+@Table_name+']'

             SELECT @Schema_name='['+@Schema_name+']'

While (@Counter<=@Total_Rows )
begIN
--PRINT @Counter

    SELECT @ComaCol= @ComaCol+'['+Column_Name+'],'
    FROM @COLUMNS
WHERE [Row_number]=@Counter

SELECT @CONDITIONS=@CONDITIONS+ ' +Case When ['+Column_Name+'] is null then ''Null'' Else ''''''''+

 Replace( Convert(varchar(Max),['+Column_Name+']  ) ,'''''''',''''  )

  +'''''''' end+'+''','''

FROM @COLUMNS
WHERE [Row_number]=@Counter
AND Column_name NOT IN ('FTP_PASSWORD','FTP_ENCRYPTED_PASSWORD')

SET @Counter=@Counter+1

End

SELECT @CONDITIONS=RIGHT(@CONDITIONS,LEN(@CONDITIONS)-2)

SELECT @CONDITIONS=LEFT(@CONDITIONS,LEN(@CONDITIONS)-4)
SELECT @ComaCol= substrINg (@ComaCol,0,  len(@ComaCol) )

SELECT @CONDITIONS= '''INSERT INTO '+@Schema_name+'.'+@Table_name+ '('+@ComaCol+')' +' Values( '+'''' + '+'+@CONDITIONS

SELECT @CONDITIONS=@CONDITIONS+'+'+ ''')'''

--PrINt(@Condition)
SELECT @CONDITIONS= 'SELECT  '+@CONDITIONS +'FROM  ' +@Schema_name+'.'+@Table_name+' With(NOLOCK) ' + ' WHERE '+@Condition
--prINt(@CONDITIONS)
Exec(@CONDITIONS)

/****** let's use it  ******/
EXEC [dbo].[INSERT] 'dbo.TABLE WHERE COLUMN_NAME=''TEXT'''

проектов

1 —  Db.ProcedureDeployer

Вы, как фирма, имеете более программную среду ( DEVUATPREPORD ). Вы должны изменить имя часто используемой таблицы и изменить в результате. Вы должны обновить хранимые процедуры, представления, триггеры, которые использовали эту таблицу одновременно. Это действительно надоедливая работа. Это не причина делать эту работу особенно. Я посвятил себя созданию консольного приложения для этого. Я хочу сделать это автоматически, и я разработал этот проект. Я использовал  объекты управления SQL Server (SMO)  для доступа к базе данных. Вероятно, вы можете найти  файл Microsoft.SqlServer.Smo.dll  в каталоге « C: \ Program Files (x86) \ Microsoft SQL Server \ 110 \ SDK \ Assemblies \ Microsoft.SqlServer.Smo.dll ».

посетите здесь для получения более подробной информации  : D http://technet.microsoft.com/en-us/library/ms162557.aspx a

2 —   Db.JunkFinder

Я разработал этот проект как консольное приложение. Он находит временные или ненужные объекты базы данных (хранимая процедура, таблица, триггер, представление, функция), которые мы создали в базе данных, а затем экспортирует их в виде списка. Если вы хотите после тестирования, вы можете удалить эти объекты. Команды разработчиков особенно должны выполнять эти виды работ и управлять процессами в корпоративной базе данных. Эта работа повышает производительность базы данных.

Вы можете получить доступ к   страницам GitHub  и  Gist , нажав на заголовок. Это все на данный момент. Хорошего кодирования