Mostrando postagens com marcador FUNCOES. Mostrar todas as postagens
Mostrando postagens com marcador FUNCOES. Mostrar todas as postagens

quinta-feira, 9 de novembro de 2017

Funções determinísticas e não determinísticas - SQL Server

          As funções determinísticas sempre retornam o mesmo resultado quando são chamadas com o uso de um conjunto específico de valores de entrada e quando recebem o mesmo estado do banco de dados. 
          As funções não determinísticas podem retornar resultados diferentes cada vez que são chamadas com um conjunto específico de valores de entrada, mesmo que o estado do banco de dados que elas acessam permaneça o mesmo. Por exemplo, a função AVG sempre retorna o mesmo resultado, dadas as qualificações declaradas acima, mas a função GETDATE, que retorna o valor datetime atual, sempre retorna um resultado diferente. Este tópico identifica o determinismo de funções de sistema internas e o efeito da propriedade determinística de funções definidas pelo usuário.

Determinismo de função interna

Você não pode influenciar o determinismo de nenhuma função interna. Cada função interna é determinística ou não determinística com base no modo como a função é implementada peloSQL Server. Por exemplo, a especificação de uma cláusula ORDER BY em uma consulta não altera o determinismo de uma função usada nessa consulta.

As seguintes funções internas pertencentes a categorias de funções internas que sempre são determinísticas.
ABSDATEDIFFPOWER
ACOSDAYRADIANS
ASINDEGREESROUND
ATANEXPSIGN
ATN2FLOORSIN
CEILINGISNULLSQUARE
COALESCEISNUMERICSQRT
COSLOGTAN
COTLOG10YEAR
DATALENGTHMONTH
DATEADDNULLIF

As funções a seguir nem sempre são determinísticas, mas podem ser usadas em exibições indexadas ou índices em colunas computadas quando são especificadas de uma maneira determinística.

Todas as funções de agregação: Todas as funções de agregação são determinísticas, a menos que sejam especificadas com as cláusulas OVER e ORDER BY. 
CAST Determinística a menos que usado com datetimesmalldatetimeou sql_variant.
CHECKSUM Determinístico, com a exceção de CHECKSUM().
ISDATE Determinístico somente se usado com a função CONVERT, o parâmetro de estilo CONVERT é especificado e o estilo não é igual a 0, 100, 9 ou 109.
RAND RAND só é determinística quando um parâmetro seed é especificado.
CONVERT  Determinística, a menos que um destas condições exista:
O tipo é sql_variant. O tipo de destino é sql_variant e seu tipo de origem é não determinístico.
O tipo de origem ou de destino é datetime ou smalldatetime, o outro tipo de origem ou destino é uma cadeia de caracteres, e um estilo não determinístico é especificado. Para ser determinístico, o parâmetro de estilo deve ser uma constante. Além disso, estilos menores ou iguais a 100 são não determinísticos, com exceção dos estilos 20 e 21. Estilos maiores que 100 são determinísticos, com exceção dos estilos 106, 107, 109 e 113.

Todas as funções estatísticas de configuração, cursor, metadados, segurança e sistema são não determinísticas. As funções a seguir nunca são determinísticas
@@CONNECTIONSGETDATE
@@CPU_BUSYGETUTCDATE
@@DBTSGET_TRANSMISSION_STATUS
@@IDLELAG
@@IO_BUSYLAST_VALUE
@@MAX_CONNECTIONSLEAD
@@PACK_RECEIVEDMIN_ACTIVE_ROWVERSION
@@PACK_SENTNEWID
@@PACKET_ERRORSNEWSEQUENTIALID
@@TIMETICKSNEXT VALUE FOR
@@TOTAL_ERRORSNTILE
@@TOTAL_READPARSENAME
@@TOTAL_WRITEPERCENTILE_CONT
AT TIME ZONEPERCENTILE_DISC
CUME_DISTPERCENT_RANK
CURRENT_TIMESTAMPRAND
DENSE_RANKRANK
FIRST_VALUEROW_NUMBER
FORMATTEXTPTR

segunda-feira, 18 de abril de 2016

Funções: String_Split() - SQL Server 2016

Microsoft SQL Server 2016 e String_Split(), agora ficou fácil dividir uma string.

Fala galera, boa tarde, segunda – feira de impeachment, eita dia complicado, começo de semana é tenso, pois saber que mais um final de semana se passou . Seguindo a onda de informações, anúncios, posts, entre outras formas de divulgação sobre o Microsoft SQL Server 2016, hoje vou destacar mais um pouco sobre esta nova versão e destacar mais uma das suas novidades, estou me referindo a nova Table Value Function String_Split(). Algo que realmente era muito pedido pelos desenvolvedores e que a Microsoft demorou um pouco para reconhecer a sua importância, mas na versão 2016 ela está presente e será muito útil.
String_Split()
Pode-se dizer que é uma daquelas funções desejadas por todos os profissionais que trabalham com desenvolvimento e necessitam em algum momento realizar o chamado split de uma string. Se você não sabe ou conhece este termo, split pode ser entendido como fatiar, dividir, cortar, quebrar em pedaços.Fazendo uma analogia, a string_split() vai fazer exatamente isso com uma string, transformando a mesma em pequenas outras strings (substrings ou partes de uma string).
Funcionalidade ou capacidade considerado por muitos como algo realmente complexo se der feito por um SGBD – Sistema Gerenciador de Banco de Dados, ainda mais para o SQL Server se pensarmos que até a versão 2014 tínhamos a necessidade de customizar este tipo de necessidade. Mas que para nossa alegria a Microsoft introduziu este recurso que provavelmente e o que tudo indica a mesma vai fazer parte da versão final do SQL Server 2016.
Como utilizar a String_Split()
Criada para ser utilizada de maneira rápida e simples, a String_split é composta pode dois parâmetros string compatíveis com os tipos de dados: (nvarcharvarcharnchar ou char) para a string que desejamos supostamente dividir em conjunto com o caractere reconhecido como “divisor” ou “separador”, que também deve ser informado em um tipo de string compatível com os tipos de dados: nvarchar(1)varchar(1)nchar(1) ou char(1)).
Outra característica muito interessante desta função é a maneira que os dados são apresentados e retornados para usuário, onde podemos ter o retorno do split da string em uma coluna com diversas linhas representando os fragmentos “pedaços” ou “partes” da string, como também um valor caractere no tipo de dados nchar ou nvarchar de acordo com o tipo de dado utilizado, respeitando o tamanho do dado identificado no momento da fragmentação da string. Caso não seja reconhecido o tipo de dados original da string, o resultado da sua fragmentação será retornado com o tipo de dados varchar.
Exemplos
— Exemplo 1 – Separando de forma simples uma string –
SELECT * FROM STRING_SPLIT(‘Gustavo,Damatto,SQL,Server’,’,’)
GO
 Result:
Gustavo
Damatto
SQL 
Server
 — Exemplo 2 – Fazendo uso de variáveis como parâmetros de entrada de valores –
DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,
@separador CHAR(1) =’,’
SELECT * FROM STRING_SPLIT(@string,@separador)
GO
 Result:
Microsoft
SQL Server
2016
RC0

— Exemplo 3 – Armazenando o resultado da divisão de uma string em uma nova tabela –
DECLARE @string VARCHAR(100) = ‘Microsoft,SQL Server,2016,RC0′,
@separador CHAR(1) =’,’
SELECT * INTO #SplitTable FROM STRING_SPLIT(@string,@separador)
GO
 — Visualizando a estrutura da tabela —
sp_columns #SplitTable
GO
 — Consultando os dados da tabela —
select * from #SplitTable
GO
 * Após executar a system stored procedure sp_columns podemos notar que o tamanho e tipo de dados da coluna value criada através do select…into foi definido como varachar() sendo este o tipo de dados padrão utilizado pela String_Split() para garantir compatibilidade no armazenamento e apresentação de dados oriundos de uma outra tabela. 
— Exemplo 4 – Apresentando a mensagem quando o separador de string for definido com mais de um caracter —
DECLARE @string VARCHAR(100) = ‘gudamatto#@gmail#@com’,
@separador CHAR(2) ='#@'
SELECT * FROM STRING_SPLIT(@string,@separador)
GO
Como pode ser observado o Microsoft SQL Server 2016 vai lançar e apresentar uma mensagem de erro com o código 214 informando que a quantidade de caracteres ou melhor dizendo que o tamanho utilizado para o parâmetro separador foi definido acima de um caractere, sendo que, este parâmetro só identifica e reconhece um único caractere.
Resul
Msg 214, Level 16, State 11, Line 3
Procedure expects parameter ‘separator’ of type ‘nchar(1)/nvarchar(1)’.

— Exemplo 5 – Apresentando o comportamento da String_Split() quando um parâmetro apresenta valor nulo –
SELECT * FROM STRING_SPLIT(‘scriptsemsql,blogspot,com’,NULL)
GO
 Para este exemplo 5 o comportamento do SQL Server 2016 é exatamente o mesmo do exemplo 4, onde será apresentada uma mensagem de erro informando que o tamanho informado no parâmetro separado, foi definido acima de um caractere.
Result
Msg 214, Level 16, State 11, Line 3
Procedure expects parameter ‘separator’ of type ‘nchar(1)/nvarchar(1)’.

 — Exemplo 6 – Apresentando o comportamento da String_Split() quando o carácter do final da string é o mesmo utilizado como separador –
SELECT * FROM STRING_SPLIT(‘Conhecendo,SQL Server,2016,’,’,’)
GO
 Este é um cenário bem interessante e pode ocorrer a qualquer momento, nesta situação o SQL Server 2016 vai trabalhar da mesma forma que os outros exemplos, analisando e identificando a string e posteriormente fazendo a fragmentação com base no caractere separador, mesmo que este seja um caractere utilizado no final da string.
Note que que criada 4 linhas de registro sendo que a última não apresentará valores por será reconhecida e tratada como uma linha nula ou em branco.
Result
Conhecendo
SQL Server
2016
 Legal, legal, acredito que agora ficou ainda mais fácil de entender e compreender como a String_Split() é fácil de ser utilizado e principalmente a maneira que os dados são apresentando e retornado para usuário. Desta forma, vou encerrar mais este artigo por aqui, quero também aproveitar para disponibilizar abaixo uma relação de links sobre os principais posts referentes ao SQL Server 2016 que estou desde 2015 publicando.
* alguns dos exemplos apresentados aqui foram elaborados e executados no banco de dados de exemplo AdventureWorks2016 CTP3, caso venha tenha interesse em realizar o download desta sample database, utilize o link: https://www.microsoft.com/en-us/download/details.aspx?id=49502
Acesse também da documentação oficial Microsoft sobre a String_Split(): https://msdn.microsoft.com/en-us/library/mt684588.aspx

Conclusão
Como você pode observar uma das mais esperadas funcionalidades foi adicionada ao SQL Server, a capacidade de fragmentar, dividir, fatiar uma string em pequenas partes ou substrings. Recurso mais que necessário e importante para qualquer desenvolver ou profissional de banco de dados que necessita analisar um texto “string” e através de um caractere denominado separador delimitar como pode ser gerada fragmentos deste texto.
A cada novo build liberado pela Microsoft podemos observar e notar o grande trabalho e esforço que esta sendo feito para transformar o Microsoft SQL Server 2016 na maior e principal versão do produto desde o grande salto dado em 2005 com o lançamento naquele momento da versão 2005.
Funções similares ao String_Split() estão sendo cada vez mais disponibilidades e adicionadas ao produto como forma de fazer com que o SQL Server se torne uma plataforma única de desenvolvimento, administração, armazenamento e gestão de banco de dados, isso representa uma grande evolução e atenção das equipes de desenvolvimento e engenheiros do produto em atender e satisfazer a comunidade técnica que se dedica a estudar e conhecer cada vez mais o SQL Server.
Acredito que os exemplos apresentados aqui conseguir mostrar a simplicidade de se trabalhar com esta nova funcionalidade, ilustrando sua simplicidade no uso e forma de obter os resultados.
Mais uma vez agradeço a sua atenção, seu interesse em visitar o meu blog, espero encontra-lo em outras oportunidades. Deixe seus comentários, críticas e sugestões, até a próxima abraços.