Arquivo

Archive for the ‘SQL Server’ Category

Treinamento: Dominando o SQL Server 2008

Pessoal, estou a algum tempo sem escrever artigo e agora revelo o motivo.

Fui convidado pela iMasters a preparar um treinamento de SQL Server 2008 online. E após um longo trabalho consegui desenvolver esse treinamento que já está disponível na iMasters PRO.

Desenvolvi o treinamento voltado para profissionais ou estudantes que atuam no desenvolvimento de aplicativos baseados em banco de dados SQL Server.

Você pode conferir o índice do treinamento no link acima.

O valor é de R$ 79,90 reais e pode ser parcelado em 3x.

Espero que gostem e pretendo criar novos treinamentos.

E agora posso me dedicar a novos artigos (se a monografia deixar) :D.

Até a próxima.

 

Anúncios

SQL Server 2011?

A Microsoft liberou a versão CTP 1 do SQL Server 2011 code name “Denali”. O Nome 2011 é relativo, é chamado de versão 11 por causa das versões anteriores 9 – 2005 e 10 – 2008.

Mais informações em no site Kodyaz e no site da Microsoft.

Categorias:SQL Server

Dica SQL Server: Resolvendo o Autonomous Transaction no SQL Server

Olá.

Primeiro post de 2011, espero que esse ano seja cheio de realizações a todos.

O ano começou triste para mim porque ontem Lost acabou (pelo menos pra mim.rs), assisti a o último episódio e um sentimento estranho está no ar, estou meio perdido. Enfim vamos ao que interessa, rsrs. Comecei a escrever um novo artigo e em breve irei publicar, por hora, gostaria que recomendar o artigo do Victor Rodrigues sobre Autonomous Transaction, recomendo a todos.

Até mais.

Tipo de Transações no SQL Server

O SQL Server fornece três maneira de tratar transações, que podemos definir dentro de uma conexão. Essas três maneiras são:

  • Transações de autoconfirmação
  • Transações explícitas
  • Transações implícitas

Vamos explicar cada uma na prática, para isso em um banco de dados qualquer crie a seguinte tabela:

CREATE TABLE OBJETO (
ID INT NOT NULL PRIMARY KEY,
COLUNA1 VARCHAR(20) NOT NULL,
COLUNA2 VARCHAR(20) NULL);

Com a tabela criada vamos às transações:

Transações de autoconfirmação

Para explicar esse modelo vamos a prática, faca os 3 inserts abaixo:

INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna');
INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna');
INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna');

Após a execução, recebemos a seguinte mensagem:

(1 row(s) affected)
Msg 515, Level 16, State 2, Line 3
Cannot insert the value NULL into column ‘COLUNA1’, table ‘QUESTIONARIO.dbo.OBJETO’; column does not allow nulls. INSERT fails.
The statement has been terminated.
(1 row(s) affected)

A mensagem é porque a COLUNA1 da tabela OBJETO não aceita valor NULL. Agora vamos executar um SELECT simples na tabela OBJETO. Podemos verificar que o insert 1 e 3 foram executados. Isso significa que quando o SQL Server usa transações de autoconfirmação cada instrução é uma transação por si só. Quando uma instrução produz um erro (como no insert 2) automaticamente a instrução é revertida, senão ela é confirmada.

Transações explícitas

Nesse tipo de transação o desenvolvedor define onde a transação é inicializada e onde ela é finalizada ou revertida. Para isso utilizaremos as seguintes instruções:

  • BEGIN TRANSACTION: para iniciar uma transação;
  • COMMIT TRANSACTION: para confirmar uma transação;
  • ROLLBACK TRANSACTION: para reverter uma transação;

A palavra TRANSACTION pode ser abreviada para TRAN. Vamos ao exemplo para isso peço que você exclua todos os registros da tabela OBJETO.

Agora vamos utilizar o código da seguinte forma:

INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna');
INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna');
INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna');
COMMIT TRAN

Vamos executa o código e o que acontece? Você irá receber a mesma mensagem de erro do exemplo anterior e ao executar uma consulta na tabela OBJETO irá obter o mesmo resultado, então o que mudou? Lembre-se é responsabilidade do desenvolver determinar se a transação deve ser revertida. No exemplo acima não fizemos nenhum tratamento para que a instrução fosse revertida caso um erro aconteça.

Melhorando nossa rotina. Exclua novamente todos os registros da tabela OBJETO e vamos agora alterar nosso exemplo conforme abaixo:

BEGIN TRY
    BEGIN TRAN

        INSERT INTO OBJETO VALUES (1, 'Primeira coluna', 'Primeira coluna');
        INSERT INTO OBJETO VALUES (2, null, 'Segunda coluna');
        INSERT INTO OBJETO VALUES (3, 'Terceira coluna', 'Terceira coluna');

        COMMIT TRAN;

    END TRY

BEGIN CATCH
    SELECT ERROR_NUMBER() AS "ERROR_NUMBER",
               ERROR_SEVERITY() AS "ERROR_SEVERITY",
               ERROR_STATE() AS "ERROR_STATE",
               ERROR_PROCEDURE() AS "ERROR_PROCEDURE",
               ERROR_LINE() AS "ERROR_LINE",
               ERROR_MESSAGE() AS "ERROR_MESSAGE"

    RAISERROR('Erro na transação', 14, 1)

    ROLLBACK TRAN;

END CATCH;

Nesse exemplo estamos utilizando a rotina de tratamento de erro TRY e CATCH.

Execute a rotina acima e veja que nenhum registro será incluído na tabela OBJETO, ou seja, que a reversão da instrução foi executada com sucesso. Para melhorar nosso tratamento de erro adicionei ao CATCH uma consulta que traga mais informações sobre o erro e uma mensagem de erro.

Transações implícitas

Esse terceiro modo de transação no SQL Server inicia uma transação se nenhuma transação estiver sido inicializada, mas o COMMIT ou ROLLBACK deve ser definido pelo desenvolvedor.

Para usar esse tipo de transação precisamos ativa-la no SQL Server usando o código abaixo:

SET IMPLICIT_TRANSACTIONS ON;

Agora execute a instrução abaixo para verificar quantas transações em aberto existem:

SELECT @@TRANCOUNT

Você deve ter como resultado o valor 0.
Crie uma tabela simples e execute o @@TRANCOUNT novamente:

CREATE TABLE TESTE (ID INT PRIMARY KEY);
SELECT @@TRANCOUNT;

O resultado agora é 1, uma transação foi inicializada. E se executamos um insert simples nessa tabela?

INSERT INTO TESTE VALUES (5);
SELECT * FROM TESTE;
SELECT @@TRANCOUNT;

A instrução insert foi executada, porém continuamos a ter uma única transação.
Para finalizar vamos executar um ROLLBACK:

ROLLBACK TRAN;
SELECT @@TRANCOUNT;

Pronto nossa transação foi revertida. Quer confirmar. Execute um SELECT na tabela TESTE. O que aconteceu? Uma mensagem de erro informando que a tabela não existe é exibida, ou seja, nosso ROLLBACK reverteu tudo, desde insert a criação da tabela.

Para finalizar vamos desativar as transações implícitas:

SET IMPLICIT_TRANSACTIONS OFF;

Chegamos ao fim desse artigo, porém não do assunto, existem mais informações sobre transações que você pode pesquisar como Transações aninhadas, níveis de isolamento de uma transação, entre outros.

Obrigado pessoal e até a próxima.

SQL Server: Utilizando OPENROWSET para salvar arquivo no banco de dados

Uma vez em uma aplicação eu precisava pegar uma determinada imagem em um servidor e salva-lá no banco de dados SQL Server em uma coluna do tipo IMAGE.

A solução foi o código abaixo.

COLUNA = (SELECT * FROM OPENROWSET(BULK '\\notebook\public\teste.jpg', SINGLE_BLOB) AS IMAGEM)

Vamos as explicações:

OPENROWSET – Inclui todas as informações de conexão exigidas para acessar dados remotos de uma fonte de dados OLE DB. No meu exemplo estou acessando o endereço \\notebook\public.

BULK – Usando pelo OPENROWSET para ler um arquivo. Nesse exemplo estou informando o OPENROWSET para ler o arquivo teste.jpg

SINGLE_BLOB – Retorna um conjunto de linha do tipo varbinary(max).

No final eu realizo um CAST para IMAGE e consigo salvar a imagem no banco de dados.

Importante: OPENROWSET pode ser usado para acessar dados remotos de fontes de dados OLE DB somente quando a opção do Registro DisallowAdhocAccess está definida explicitamente como 0 para o provedor especificado, e quando a opção de configuração avançada Ad Hoc Distributed Queries está habilitada. Quando essas opções não estão definidas, o comportamento padrão não permite acesso ad hoc.

Referência: MSDN

Obrigado e até a próxima.

Categorias:SQL Server Tags:,

SQL Server: Como utilizar sp_ExecuteSql

setembro 6, 2010 1 comentário

O SQL Server possui uma stored procedure chamada sp_executeSql que permite executar frases T-SQL dinamicamente definida pelo desenvolvedor através do comando EXECUTE. Quando utilizamos sp_executeSql devemos informar uma série de parâmetros e tipo de dados.

Quando passamos uma consulta dinâmica para sp_executeSql um plano de consulta é criado e armazenado, assim quando essa mesma consulta for executada novamente, sp_executeSql irá apenas substituir os valores da consulta, ganhando assim performance a partir da segunda execução.

Com sp_executeSql podemos executar não apenas a instrução SELECT, mas também INSERT, UPDATE, DELETE, enfim qualquer ação no banco de dados que sua aplicação requer, podendo inclusive ter parâmetro de saída.

Vamos fazer um exemplo utilizando o banco de dados AdventureWorks (download aqui).

--Declarando as variáveis
DECLARE @sql NVARCHAR(200)
DECLARE @params NVARCHAR(50)
DECLARE @Sexo NVARCHAR(3)
DECLARE @Casado NVARCHAR(3)

--Criando a consulta
SET @sql = 'SELECT DISTINCT CONVERT(VARCHAR(10), h.BirthDate, 103) AS BirthDate ' +
           '  FROM HumanResources.Employee h ' +
           ' WHERE h.Gender > @Gender ' +
           '   AND h.MaritalStatus = @Marital'

--Criando o parâmetros
SET @params = '@Gender NVARCHAR(3), @Marital NVARCHAR(3)'

--Passando valores para os parâmetros
SET @Casado = 'M'
SET @Sexo = 'F'

EXECUTE sp_executeSql @sql, @params, @Gender=@Sexo, @Marital=@Casado

Obrigado e até a próxima

Stop/Start no SQLSERVER via comandos C#

Caso você precise iniciar ou parar uma instância do SQL Server pode utilizar o exemplo abaixo:

//Pega a instância do SQL Server Express do Cliente
ServiceController scExpress = new ServiceController("MSSQL$SQLEXPRESS");

//Se o status da instância for STOPPED, ela ficará STARTED 
if (scExpress.Status.Equals(ServiceControllerStatus.Stopped) || scExpress.Status.Equals(ServiceControllerStatus.StopPending) ||
          scExpress.Status.Equals(ServiceControllerStatus.Paused) || scExpress.Status.Equals(ServiceControllerStatus.PausePending))
{
    scExpress.Start(); //Starta o processo
    scExpress.WaitForStatus(ServiceControllerStatus.Running); //Aguarda até que o processo fique startado definitivamente
}

Cuidado: O nome da instância pode várias de servidor para servidor.

Esse código eu aprendi com meu amigo Victor Rodrigues.

Obrigado e até a próxima.