Database
 sql >> Base de Dados >  >> RDS >> Database

Concatenação no Transact-SQL

Introdução


Supondo que você mantenha uma tabela contendo dados de clientes e seu chefe peça para você enviar a lista atual de clientes e seus números de telefone. Você normalmente extrairia os dados e enviaria a ele uma planilha com linhas e colunas. Você também pode decidir ser um pouco elegante e enviar a ele as informações necessárias em um formato mais amigável. O SQL Server fornece funções que nos permitem fazer isso combinando expressões em inglês com dados em tabelas para apresentar uma saída mais fácil de ler para pessoas não técnicas. Essas funções também podem ter usos mais sutis.


A função CONCAT


A função CONCAT aceita dois ou mais argumentos de string e retorna a combinação de tais strings como uma única expressão. Isso pode ser útil se você quiser exibir o conteúdo de diferentes colunas como uma única expressão. Um exemplo simples de uso desta função é mostrado na Listagem 1.
-- Listagem 1:Instrução CONCAT Simplesselect CONCAT('This','Function','joins','strings.') as statement1;select CONCAT('This ','Function ','joins ','strings .') como instrução2;selecione CONCAT('This',' ','Function',' ','joins',' ','strings') como instrução

Observe as variações desta declaração usando o espaço e os resultados na Fig. 1.



Fig. 1. Declaração CONCAT simples

Se tentarmos usar a instrução CONCAT com um valor de entrada do tipo de dados INT, o SQL Server fará uma conversão implícita e ainda retornará uma string de saída como mostrado na Fig 2. detalhes da instrução na Listagem 2. Primeiro, dê uma olhada na estrutura da tabela que nos interessa. A Fig 2 nos mostra que o PhoneNumber# e FirstTranDate colunas são colunas BIGINT e DATETIME, respectivamente.



Fig. 2. Estrutura da Tabela de Clientes
-- Listagem 2:Conversão Implícita Ao usar CONCAT (BIGINT)USE EXAMGOSELECT CONCAT(nome, ' ', sobrenome, '''s ', 'Número do telefone é ',número do telefone1) FROM CUSTOMER;

Uma rápida olhada no plano de execução nos mostra que o SQL Server realiza uma conversão implícita na coluna PhoneNumber1. Isso será o mesmo se a coluna for do tipo de dados de data, conforme mostrado na Listagem 4 e na Fig. 4. A função CONCAT executa a conversão implícita com base nas regras descritas no gráfico mostrado na Fig. 6.



Fig. 3. Conversão implícita do tipo de dados BIGINT para VARCHAR
-- Listagem 3:Conversão Implícita Ao usar CONCAT (DATETIME)USE EXAMGOSELECT FirstTranDate, CONCAT(FirstName, ' ',LastName, '''s ', 'first transaction date is ',FirstTranDate) como STMTFROM CUSTOMER; 


Fig. 4. Conversão Implícita de tipo de dados DATETIME para VARCHAR



Fig. 5. Conversão implícita do tipo de dados BIGINT para VARCHAR



Fig. 6. Conversão de tipo de dados no SQL Server

O caso de uso primário para esta função pode ser deduzido das demonstrações acima. Um exemplo seria um caso em que algumas informações precisam ser exibidas em um painel ou página da Web em uma linguagem mais amigável usando dados de várias colunas ou até mesmo tabelas separadas.

A função CONCAT_WS


A função CONCAT_WS é uma extensão da função CONCAT. Ele nos permite especificar um separador desejado como o primeiro parâmetro. A Listagem 4 nos mostra uma modificação de uma das instruções que usamos anteriormente na Listagem 1.
--Listagem 4 Usando CONCAT_WSSELECT CONCAT('This',' ','Function',' ','joins',' ','strings') AS statement;SELECT CONCAT('This',' ',' Function',' ','joins',' ','strings') instrução AS;SELECT CONCAT_WS(' ','This','Function','joins','strings') instrução AS;

Observe que CONCAT_WS torna mais simples construir uma instrução com espaço como separador em comparação com a introdução de um espaço como argumento após cada argumento.
--Listagem 5 Usando CONCAT_WS com ColunasUSE EXAMGOSELECT CONCAT(firstname, ' ',lastname, '''s ', 'Phone number is ',phonenumber1) FROM CUSTOMER;USE EXAMGOSELECT CONCAT_WS(' ',firstname,lastname, ' ''s ', 'O número de telefone é',phonenumber1) FROM CUSTOMER;

Concatenação com o sinal “+”


O SQL Server suporta o uso do sinal “+” para alcançar o que a função CONCAT faz de uma maneira muito mais simples. Essa abordagem geralmente é usada para gerar instruções T-SQL quando você precisa executar operações em um grande número de objetos. A Listagem 7 mostra como podemos gerar um lote de atualização de Estatísticas para todas as tabelas do banco de dados do Exame.
-- Listagem 6 Gerando instruções de estatísticas de atualizaçãoUSE ExamGOSELECT 'UPDATE STATISTICS ' + nome + ' WITH SAMPLE 25 PERCENT;' como STMT de sys.tables;SELECT 'UPDATE STATISTICS [' + nome + '] WITH SAMPLE 25 PERCENT;' como STMT de sys.tables;GO

Observe os colchetes na segunda declaração. É útil ao lidar com um objeto do sistema com espaços ou caracteres especiais.
-- Listagem 7 Gerando Declarações de Criação de UsuárioUSE MASTERGOSELECT 'CREATE USER [' + LOGINNAME + '] FOR LOGIN [' + LOGINNAME + '];' AS STMT DE SYSLOGINSWHERE LOGINNAME NOT LIKE '#%';GOUSE EXAMGOCREATE USER [sa] PARA LOGIN [sa];CREATE USER [EPG-KIGIRI\ekocauris] FOR LOGIN [EPG-KIGIRI\ekocauris];CREATE USER [KAIROSAFRIKA\kigiri] FOR LOGIN [KAIROSAFRIKA\kigiri];CREATE USER [NT SERVICE\SQLWriter] FOR LOGIN [NT SERVICE\SQLWriter];CREATE USER [NT SERVICE\Winmgmt] FOR LOGIN [NT SERVICE\Winmgmt];CREATE USER [NT Service\MSSQL$ I2019] PARA LOGIN [NT Service\MSSQL$I2019];CREATE USER [NT AUTHORITY\SYSTEM] FOR LOGIN [NT AUTHORITY\SYSTEM];CREATE USER [NT SERVICE\SQLAgent$I2019] FOR LOGIN [NT SERVICE\SQLAgent$I2019];CRIAR USUÁRIO [NT SERVICE\SQLTELEMETRY$I2019] PARA LOGIN [NT SERVICE\SQLTELEMETRY$I2019];CRIAR USUÁRIO [KAIROSAFRIKA\sberko] PARA LOGIN [KAIROSAFRIKA\sberko];GO

Depois que a saída é gerada, ela pode ser usada para criar usuários em qualquer banco de dados desejado, conforme mostrado na Listagem 7. Observe que adicionamos um filtro para os nomes de login nos quais estamos interessados. Essa abordagem pode ser usada para gerar todos os tipos de instruções e chamar essas instruções na mesma sessão. Um exemplo mais complexo são as instruções a seguir que reconstroem criativamente todos os índices em qualquer banco de dados. (Consulte as Listas 8 e 9).
--Listagem 8 Gerando Instruções de Reconstrução de ÍndiceUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1), REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB SELECT 'SET QUOTED_IDENTIFIER ON;ALTER INDEX [' + B.NAME + '] ON [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT_ID) + '] REBUILD WITH (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF );'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL) AS A JOIN SYS.INDEXES AS B JOIN SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B .OBJECT_ID AND A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;SELECT * FROM #INDTAB;GODROP TABLE #INDTAB;GO--Listagem 9 Gerando e executando instruções de reconstrução de índiceUSE EXAMGOCREATE TABLE #INDTAB (ID SMALLINT IDENTITY(1,1) , REBUILDSTMT NVARCHAR(600))INSERT INTO #INDTAB SELECT 'SET QUOTED_IDENTIFIER ON;ALTER INDEX [' + B.NAME + '] ON [' + SCHEMA_NAME(C.SCHEMA_ID) + '].[' + OBJECT_NAME(A.OBJECT _ID) + '] REBUILD WITH (ONLINE =OFF,FILLFACTOR=80,SORT_IN_TEMPDB=ON,PAD_INDEX =ON, STATISTICS_NORECOMPUTE =OFF);'--INTO #INDTABFROM SYS.DM_DB_INDEX_PHYSICAL_STATS (DB_ID(), NULL, NULL, NULL, NULL ) AS A JOIN SYS.INDEXES AS B JOIN SYS.OBJECTS AS CON B.OBJECT_ID =C.OBJECT_IDON A.OBJECT_ID =B.OBJECT_ID E A.INDEX_ID =B.INDEX_ID WHERE AVG_FRAGMENTATION_IN_PERCENT> 30;GODECLARE @SQL NVARCHAR(4000); SELECT @SQL=REBUILDSTMT FROM #INDTAB;PRINT @SQLEXEC SP_EXECUTESQL @SQL;GODROP TABLE #INDTAB;GO

A consulta na Listagem 10 mostra como podemos combinar strings com datas explicitamente convertidas em strings. A Concatenação de String é usado para gerar uma variável de caminho de backup comum que é usada posteriormente na função SP_MSFOREACHDB.
--Lista 10 Gerando um caminho de backup comumEXEC SP_MSFOREACHDB @COMMAND1='DECLARE @BACKUP SYSNAMESET @BACKUP=N''G:\BACKUP\?''+CONVERT(NVARCHAR,GETDATE(),112)+N'' .BAK''USE [?]IF ''?'' NOT IN ("MODEL","TEMPDB")BEGINBACKUP DATABASE ? TO DISK =@BACKUP COM INIT , NOUNLOAD , COMPRESSION,NAME =N''?'', NOSKIP , NOFORMATEND'

Conclusão


Neste artigo, mostramos algumas maneiras de usar a concatenação no SQL Server. Demos exemplos da função CONCAT, da função CONCAT_WS e do uso do sinal “+”. Todos os três métodos podem ser muito úteis na geração de declarações combinando valores de diferentes colunas ou simplesmente para exibir informações em um formato amigável desejado para as pessoas. A documentação da Microsoft tem mais informações sobre a sintaxe e os recursos dessas funções.

Referências


Transmitir e converter (Transact-SQL)

Concat Transact-SQL

Concat_ws Transact-SQL

Concatenação de String