Função Escalar x Table Valued Function

Muito se fala na internet sobre como as funções escalares são terríveis e que devemos evitar o uso a todo o custo… Eu gostaria de mostrar o porquê: Vejam o seguinte script abaixo (um procedimento muito utilizado por aí: a utilização de uma função escalar que trata “N” casos e retorna o valor desejado). Primeiro, a criação da tabela e inserção dos dados: CREATE TABLE NotaFiscal (Cod int identity primary key, Pessoa varchar(20), Valor decimal (15,2), Data date) CREATE INDEX Ncl_NotaFiscal ON NotaFiscal (Data) INCLUDE (Pessoa, Valor) GO -- Inserindo 10 notas no período de 500 dias (5000 notas). INSERT INTO NotaFiscal SELECT 'Logan', 100, DATEADD(DD, Number, '2012-12-31') from Numbers WHERE Number < 500 GO 10 GO CREATE FUNCTION CalculaTributos (@Codigo int, @Tipo char(1)) Returns decimal(15,2) AS BEGIN DECLARE @valor decimal(15,2) SELECT @Valor = CASE @tipo WHEN 'a' then valor * 0.1 WHEN 'b' then valor * 0.3 WHEN 'c' then valor * 0.5 END FROM NotaFiscal RETURN @valor END; ...

01 jul. 2013 · 3 minutos · 509 palavras · Logan D. Merazzi

3º Encontro do grupo SQLServerRS de 2013 – Scripts

Pessoal, Antes de qualquer coisa, gostaria de agradecer ao grupo (pela enésima vez) a oportunidade de me permitir palestrar neste 3º encontro. O encontro na Ftec foi muito bom, primeiramente com o Marcus Vinícius falando sobre a comunidade SQL Server e o PASS. Após, eu assumi o projetor e falei sobre Snapshot no SQL Server. ...

09 mai. 2013 · 1 minuto · 164 palavras · Logan D. Merazzi

3º Encontro de 2013 do Grupo SQL Server RS – Comigo!

Pessoal, com muita honra e orgulho foi convidado pelo Chapter Leader do grupo SQL Server RS, Marcus Vinícius Bittencourt para palestrar no próximo encontro do grupo. Pois bem, o encontro será realizado na FTEC (Caxias do Sul – RS), no dia 04/05/2013 às 14 horas e o assunto será: Snapshot Database: o que é, pra que serve e como usar. Fica aberto o convite à todos! Até!

29 abr. 2013 · 1 minuto · 67 palavras · Logan D. Merazzi

SQL Server + Volume Shadow Copy = Sem backup diferencial.

Após implementar o recurso de envio de e-mails com os erros de backup do SQL Server, notei que o backup diferencial não estava sendo executado, apresentando o seguinte erro: Cannot perform a differential backup for database “MyDatabase”, because a current database backup does not exist. Perform a full database backup by reissuing BACKUP DATABASE, omitting the WITH DIFFERENTIAL option. [SQLSTATE 42000] (Error 3035) BACKUP DATABASE is terminating abnormally. [SQLSTATE 42000] (Error 3013). The step failed. ...

24 abr. 2013 · 2 minutos · 383 palavras · Logan D. Merazzi

SQL Server Database Snapshot

O Database Snaphot (ou “instantâneo de Banco de Dados”, se você estiver no SQL Server em português – Que nome terrível, hehehe) é um banco de dados _somente leitura, _onde o SQL Server guarda os dados originais de tudo o que está sendo alterado pelos usuários, para que seja possível realizar verificações (dentre outras coisas) de como estava o banco antes destas ocorrerem. Ao contrário do que muita gente pensa, as alterações ocorrem nas páginas de dados e não no objeto que está sofrendo alteração. O SQL Server utiliza um recurso chamado “Copy-on-write” onde, antes da página ser alterada, os dados originais são armazenados no snapshot. ...

12 abr. 2013 · 5 minutos · 959 palavras · Logan D. Merazzi

SQL Server Internal Ops. Eu fui!

No dia 07/12, foi realizado na PUC o SQL Server Internal Ops, um evento idealizado pelas comunidades SQL Server RS e MSITPSC, com o apoio da Microsoft e da Dell. Há muito tempo que eu ansiava por um evento do gênero aqui em Porto Alegre, com foco 100% em SQL Server, uma vez que já houveram eventos semelhantes em São Paulo, Rio de Janeiro (Que eu felizmente consegui ir), Recife (com o SQL Saturday) enquanto nós, que moramos aqui no RS, não tínhamos nada. ...

09 dez. 2012 · 5 minutos · 960 palavras · Logan D. Merazzi

“No such interface supported” ao criar / abrir um projeto no SSMS 2012

Onde trabalhamos, utilizamos o Source Safe para realizar o controle de alterações nas functions e procedures de Banco de Dados. Foi criado um projeto que contém os objetos e, dentro do SSMS, fazemos o checkout / checkin deles, já integrado com o Source Safe. Acontece que hoje, ao tentar migrar o projeto para abrirmos no SQL Server Management Studio 2012, apareceu o erro: Error: No such interface supported File: vsee\internal\inc\vscomptr.inl Line number: 259 ...

05 set. 2012 · 1 minuto · 152 palavras · Logan D. Merazzi

Cuidados ao usar Exists

6 meses depois do último post (e com o planejamento de ano novo completamente furado – o de postar pelo menos 1 vez a cada 15 dias… 🙁 )… Dica rápida para quem usar EXISTS : Nunca utilize uma função de agregação quando utilizar o EXISTS. Por quê? Segue um script rápido que insere alguns poucos registros em uma tabela para testarmos… CREATE DATABASE TesteExists --Super original, não? :-) GO USE TesteExists GO CREATE TABLE Pessoa (Nome varchar(20), Nascimento datetime, Sexo char(1), CPF varchar(11), EstadoCivil char(1)) GO INSERT INTO Pessoa Values ('Logan', '19810101', 'M', '11111111111','C') INSERT INTO Pessoa Values ('Denise','19800101', 'F', '22222222222','C') INSERT INTO Pessoa Values ('Sophia', '20120101', 'F', NULL,'S') GO IF EXISTS (SELECT MAX(Nascimento) FROM Pessoa WHERE nome = 'xxxxx') SELECT 'OK' ELSE SELECT 'NOK' ...

03 jul. 2012 · 2 minutos · 216 palavras · Logan D. Merazzi

Colunas Default (e Como Mantê-las)

Muitas vezes precisamos que uma determinada coluna receba um valor padrão, por exemplo, uma tabela de pedidos que, ao inserir um registro novo, coloca por padrão a data atual no campo que referencia a data do pedido. Ok, mas como é que eu faço isso? Muito simples, pequeno gafanhoto, ao criar uma tabela: CREATE TABLE MinhaTabela ( Codigo int identity, Nome varchar(100) NOT NULL, Valor int NOT NULL, Data datetime not null CONSTRAINT DF_MinhaTabela_Data default getdate() ) Putz! Mas o campo Valor também tinha que ter um valor Default… Será que eu consigo colocar sem ter que refazer a criação ou dropar a coluna? ...

13 dez. 2011 · 3 minutos · 490 palavras · Logan D. Merazzi

Entendendo e usando CTE (Common Table Expression)

As CTE’s são muito semelhantes às tabelas derivadas, mas com uma boa vantagem… De acordo com o BOL a estrutura para uma CTE é: WITH expression_name [ ( column_name [,...n] ) ] AS ( CTE_query_definition ) SELECT FROM expression_name; Uma comparação de uso entre uma tabela derivada e uma CTE: Tabela derivada: SELECT * FROM (SELECT Nome, Cidade FROM CLIENTES WHERE DataCadastro > '2011-01-01') AS CLI2011 Usando CTE: ;WITH CLI2011 AS ( SELECT Nome, Cidade FROM CLIENTES WHERE DataCadastro > '2011-01-01') SELECT * FROM CLI2011; Note o ‘;’ antes do WITH… Ele está lá por eu considerar uma boa prática, uma vez que sempre que você utilizar uma CTE, caso tenha alguma outra consulta antes, ela obrigatoriamente deve terminar com o ‘;’. Então, por via das dúvidas, sempre coloque ele antes do WITH, quando for usar uma CTE. ...

10 ago. 2011 · 2 minutos · 293 palavras · Logan D. Merazzi