Arquivo

Arquivo do Autor

Upgrade SQL Server

17 de janeiro de 2008 Deixe um comentário

Ao migrar de SQL 2000 para SQL 2005 existem algumas considerações importantes no Transact-SQL que necessitam de nossa atenção, por exemplo existem alguns comandos que hoje estão rodando normalmente no SQL 2000 e ao migrar simplesmente não funcionam, vamos a alguns exemplos.

 

/*

  Exemplo de sintaxes que não funcionam ao migrar de SQL 2000 para 2005

*/

 

use master

 

if exists(select * from master.dbo.sysdatabases where name = ‘TesteCompatibilidade’)

begin

  drop database TesteCompatibilidade

end

 

create database TesteCompatibilidade

 

use TesteCompatibilidade

 

if OBJECT_ID(‘teste’) is not null

begin

  drop table teste

end

GO

 

— Vamos criar uma tabela para teste

create table teste (id int Identity(1,1), nome VarChar(200) default NEWID())

GO

 

— Vamos incluir 10 linhas na tabela teste

insert into teste values(default)

go 10

 

create index ix_teste on teste(nome)

GO

 

— Seta o banco para usar o nivel de compatibilidade do SQL Server 2000(80)

— Consultas que funcionam normalmente no SQL Server 2000

sp_dbcmptlevel TesteCompatibilidade, 80

GO

–Consulta forcando o uso de um indice sem colocar o WITH depois do nome da tabela

select * from teste(index=ix_teste)

GO

— Consulta usando order by baseado em uma coluna, porem o alias ID é do mesmo nome da coluna ID

— repare que o SQL ordenou a tabela pelo campo ID da tabela e não pelo alias ID(campo nome)

select ID, Nome as ID  from teste order by ID

GO

–Consulta usando order by passando o Nome da tabela mais o alias da coluna

select ID, Nome as AliasParaNome  from teste order by teste.AliasParaNome

GO

 

— Marca o banco para usar o nivel de compatibilidade do SQL Server 2005

— Os mesmo selects efetuados acima não funcionan no SQL Server 2005

sp_dbcmptlevel TesteCompatibilidade, 90

GO

–Consulta forcando o uso de um indice sem colocar o WITH depois do nome da tabela

select * from teste(index=ix_teste)

GO

— Consulta usando order by baseado em uma coluna, porem o alias ID é do mesmo nome da coluna ID

— repare que o SQL ordenou a tabela pelo campo ID da tabela e não pelo alias ID(campo nome)

select ID, Nome as ID  from teste order by ID

GO

–Consulta usando order by passando o Nome da tabela mais o alias da coluna

select ID, Nome as AliasParaNome  from teste order by teste.AliasParaNome

 

A Microsoft disponibiliza um software que ajuda a evitar surpresas como estas, ele se chama “Microsoft SQL Server 2005 Upgrade Advisor” vale a pena baixar o software e rodar ele na sua base para ver as incompatibilidades. Também vale a pena dar uma lida no “SQL Server 2005 Upgrade Technical Reference Guide”.

 

_________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server

Data Types

7 de janeiro de 2008 3 comentários

Em relação a performance uma falha muito encontrada em banco de dados SQL Server é a má escolha dos datatypes das colunas.

 

É muito importante conhecer e escolher corretamente os datatypes das colunas nas suas tabelas por causa dos tamanho que elas ocupam  no seu banco de dados, por exemplo vamos imaginar o seguinte cenário.

 

create table testeA (ID   BigInt Primary Key,

                     Nome NChar(80),

                     Data DateTime,

                     Ano  Int,

                     Mes  Int)

 

/*

ID – BigInt = 8 bytes

Nome NChar() = 160 bytes(2 bytes para cada caracter unicode)

Data – DateTime = 8 bytes

Ano – Int = 4 bytes

Mes – Int = 4 bytes

Total = 184 bytes de dados por linha.

*/

 

— Esta mesma tabela poderia ter a seguinte estrutura

 

create table testeB (ID   Int Primary Key,

                     Nome Char(80),

                     Data SmallDateTime,

                     Ano  SmallInt,

                     Mes  TinyInt)

 

/*

ID – Int = 4 bytes

Nome Char() = 80 bytes(1 bytes para cada caracter)

Data – DateTime = 4 bytes

Ano – SmallInt = 2 bytes

Mes – TinyInt = 1 byte

Total = 91 bytes de dados por linha.

*/

 

Uma página de dados do SQL Server tem uma tamanho fixo de 8k,

ou 8192 bytes sendo distribuidos entre 3 partes: Page Header 96 bytes, Data Rows e Row OffSet Array.

 

Page Structure

 

Considerando que o SQL Server tem 8096 bytes livres(8192 – 96) para armazenamento dos dados da minha tabela e o ArrayOffSet(2 bytes) podemos dizer que dentro de cada página da minha tabela testeA temos 43 linhas de dados gravados, já na tabela testeB temos 87 registros.

 

Ou seja, a tabela testeB ocupa a metade do tamanho da tabela testeA, porque isso é importante? Vamos fazer alguns testes de select.

 

— Primeiro vamos incluir 5000 registros em cada tabela

set NoCount on

declare @i Int

set @i = 0

while @i < 5000

begin

  insert into testeA(ID, Nome, Data, Ano, Mes)

  values(@i, ‘Fabiano – ‘ + Convert(VarChar, @i), GetDate(), Year(GetDate()), Month(GetDate()))

  insert into testeB(ID, Nome, Data, Ano, Mes)

  values(@i, ‘Fabiano – ‘ + Convert(VarChar, @i), GetDate(), Year(GetDate()), Month(GetDate()))

  set @i = @i + 1

end

 

— Repare que o SQL alocou 122 paginas para a tabela

DBCC SHOWCONTIG(TesteA)

— Pages Scanned…………………………..: 122

 

— Podemos fazer a seguinte conta para verificar qual o tamanho da tabela

— 122 páginas vezes o tamanho ocupado por cada pagina / 1024 para converter o tamanho em Kb

select (122 * 8192) / 1024 — 976

— Confirmando o tamanho da tabela

sp_spaceUsed TesteA — Data = 976

 

–Vamos fazer um select na tabela TesteA e verificar quantos IOs são feitos para retornar 1/5 da tabela.

set statistics io on

select * from testeA

where ID < 1000

— Table ‘testeA’. Scan count 1, logical reads 26, physical reads 0, read-ahead reads 0.

 

— Vamos verificar o mesmo select na tabela TesteB,

— Observe que o Select na tabela testeB fez bem menos leitura para retornar os dados

— obtendo assim ganho de performance.

select * from testeB

where ID < 1000

— Table ‘testeB’. Scan count 1, logical reads 14, physical reads 0, read-ahead reads 0.

 

A escolha dos data types são muito importantes para evitar IOs desnecessários e evitar que seu banco de dados se torne muito grande rapidamente.

No projeto REAL da Microsoft, a equipe de desenvolvimento opotu por definir os campos do tipo Data como Int para poder ganhar 4 bytes de diferença entre o DateTime e o Int, a data é gravada no formato ‘yyyymmdd’.

 

Vale lembrar tambem que no SQL Server 2005 Enterprise service pack 2 existe o campo VarDecimal que vem para substituir os campos Decimal e Numeric. Você pode ler mais sobre ele no link vardecimalStorage.docx

 

Fica a seguinte regra: “Quanto mais dados em menos páginas, menos leitura para retornar mais dados”. J

 

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

Categorias:SQL Server

SQL Server 2008

7 de janeiro de 2008 Deixe um comentário

Novidades no Transact SQL do SQL Server 2008,

 

— Criar uma tabela para teste

create table TabNome(Nome VarChar(80), SobreNome VarChar(80))

 

— Incluir 4 linhas na tabela

— Existe uma nova Sintax no SQL 2008 que permite incluir varias linhas com apenas um comando Insert.

— Commando relativo ao SQL Server 2008

insert into TabNome(Nome, Sobrenome)

values(‘Fabiano’,‘Amorim’),(‘Ricardo’,‘Lopes’),(‘Eduardo’,‘Silva’),(‘Maria’,‘Oliveira’)

— Commando relativo ao SQL Server 2000, 2005

insert into TabNome(Nome, Sobrenome)

values(‘Fabiano’,‘Amorim’)

insert into TabNome(Nome, Sobrenome)

values(‘Ricardo’,‘Lopes’)

insert into TabNome(Nome, Sobrenome)

values(‘Eduardo’,‘Silva’)

insert into TabNome(Nome, Sobrenome)

values(‘Maria’,‘Oliveira’)

 

— É possivel fazer um select passando uma lista como tabela segue um exemplo,

— repare que o Alias do nome das colunas é passado após o nome da tabela.

select TabNome.*, Tab.Apelido

from TabNome

inner join (

  values(‘Fabiano’,‘Amo’),(‘Ricardo’,‘Lop’),(‘Eduardo’,‘Sil’),(‘Maria’,‘Oli’)

           ) AS tab (Nome, Apelido)

ON TabNome.Nome = tab.Nome;

 

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

Categorias:SQL Server

Casa Windows

3 de janeiro de 2008 Deixe um comentário
Até que ficou legal eim !
 
 
Casa Windows
 
Categorias:Entretenimento

Da série coisas que não deveriam existir!

3 de janeiro de 2008 Deixe um comentário

 

 

ExecutionPlan

 

 Sorriso

Categorias:SQL Server

SET VS SELECT

3 de janeiro de 2008 Deixe um comentário

É muito comum durante o desenvolvimento de um código SQL necessitarmos zerar o valor das variáveis que serão utilizadas no código.

Uma dica em relação a performance é que o comando SELECT é mais rápido do que o SET, porém está regra só se aplica quando podemos substituir um bloco de SET por um SELECT por ex:

 

— Executa um loop zerando o valor de 10 variaveis utilizando SET

— Gere o plano de execução e repare que no plano de execução que no Loop o SQL gera um SELECT para cada comando SET.

DECLARE @i Int, @Test1 int, @Start datetime

DECLARE @V1 Char(6),

        @V2 Char(6),

        @V3 Char(6),

        @V4 Char(6),

        @V5 Char(6),

        @V6 Char(6),

        @V7 Char(6),

        @V8 Char(6),

        @V9 Char(6),

        @V10 Char(6);

 

SET @Test1 = 0

SET @i = 0

SET @Start = GetDate()

WHILE @i < 50000

BEGIN

  SET @V1 =

  SET @V2 =

  SET @V3 =

  SET @V4 =

  SET @V5 =

  SET @V6 =

  SET @V7 =

  SET @V8 =

  SET @V9 =

  SET @V10 =

      SET @i = @i + 1                  

END                               

SET @Test1 = DATEDIFF(ms, @Start, GetDate())

SELECT @test1

 

GO

— Executa um loop zerando o valor de 10 variaveis utilizando SELECT

— Diferente do primeiro plano de execução o SQL gerou apenas 1 instrução para setar os valores para as 10 variáveis.

DECLARE @i Int, @Test1 int, @Start datetime

DECLARE @V1 Char(6),

        @V2 Char(6),

        @V3 Char(6),

        @V4 Char(6),

        @V5 Char(6),

        @V6 Char(6),

        @V7 Char(6),

        @V8 Char(6),

        @V9 Char(6),

        @V10 Char(6);

 

SET @Test1 = 0

SET @i = 0

SET @Start = GetDate()

WHILE @i < 50000

BEGIN

SELECT @V1 = ,

       @V2 = ,

       @V3 = ,

       @V4 = ,

       @V5 = ,

       @V6 = ,

       @V7 = ,

       @V8 = ,

       @V9 = ,

       @V10 = ,

       @i = @i + 1;

END                               

SET @Test1 = DATEDIFF(ms, @Start, GetDate())

SELECT @test1

 

Uma outra observação importante é que o SQL usou muito mais CPU no primeiro comando do que no segundo vejamos o profiler.

 

 imagem

 

Fica a dica de utilizar o comando SELECT para atribuir valor a um bloco de variáveis.

 

Segue o link de um excelente artigo sobre o assunto.

http://vyaskn.tripod.com/differences_between_set_and_select.htm

 

__________________________________________________________________ 
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server

Tipo de Joins no SQL Server

17 de dezembro de 2007 Deixe um comentário

Semana passada participei de um treinamento de SQL Server na empresa em que falamos sobre execution plan, durante o treinamento surgiram alguns operadores de joins em nossas consultas de exemplo e percebi a necessidade de falar mais sobre alguns tipos de joins, ou seja, assunto para o Blog.

 

Estou lendo o livro SQL Server 2005 Query Tunning and Optimization e vou aproveitar os excelentes exemplos e explicações de como os operadores de join funcionam.

 

Vamos nos basear na seguinte consulta para os exemplos:

 

Select codigo from tabela1

Inner join tabela2

  On tabela1.id = tabela2.id

Where tabela1.id = 10

  

Nested Loops Joins – Compara cada linha de uma tabela(também conhecido por OUTER TABLE(FROM)) com cada linha de outra tabela(também conhecido por inner table) procurando pelas linhas que satisfaçam o relacionamento.

Pseudo-Código:

 

for each row tabela1 in the outer table

  for each row tabela2 in the inner table

     if tabela1 joins with tabela2

        return(tabela1, tabela2)

 

Merge Join  – Trabalha em simultâneo lendo e comparando cada linha das duas tabelas ordenadas pelo relacionamento. Para cada etapa compara a linha atual para cada valor na tabela do join, se o valor for igual a entrada então ele retorna o join e continua a comparação. Se o valor não for igual ele descarta o resultado e continua a próxima leitura. Um Merge Join não necessariamente irá ler toda a tabela, quando a leitura chegar no fim de qualquer tabela envolvida no join o loop é parado.

Pseudo-Código:

 

Get first row tabela1 from input 1

Get first row tabela2 from input 1

While not at the end of either input

Begin

  If tabela1 joins with tabela2

  Begin

    Output(tabela1, tabela2)

    Get next row tabela2 from input 2

  end

  else if tabela1 < tabela2

    get next row tabela1 from input 1

  else

    get next row tabela2 form input 2

end

 

Hash Join – O hash join compartilha alguns conceitos do Merge Join, o algoritmo de Hash é executado em duas fases conhecidas por Build(Construção) e Probe(prova ou experimento). Durante a fase de Build o SQL irá ler todas as linhas do primeiro input(from) e criar uma tabela com os dados lidos mais o relacionamento gerando uma Hash Table em memória. Na fase do probe o SQL irá ler cada linha do segundo input(tabela do join) gerar o valor hash e verificar se o seu valor tem o mesmo valor da tabela Hash table recém criada retornando todas as linhas que tem o mesmo valor. É importante destacar que não necessariamente a Hash table sempre será gerada em memória pois o SQL irá reservar a quantidade de memória necessária para criação da tabela antes de cria-lá baseado nas statisticas geradas pelo otimizador. Caso durante e build o SQL necessite de mais memória para gerar a tabela Hash ele pode gravar os dados em um espaço temporário ou seja, TempDB.

Pseudo-Código:

 

For each row tabela1 in the build table

Begin

  Calculate hash value on tabela1 join key(s)

  Insert tabela1 into the appropriate hash bucket

End

For each row tabela2 in the probe table

Begin

  Calculate hash value on tabela2 join key(s)

  For each row tabela1 in the corresponding hash bucket

    If tabela1 with tabela2

      Ouput (tabela1, tabela2)

end

 

Cabe a dica que para os seus testes você pode forcar o SQL a usar um determinado tipo de join se os exemplos:

 

SELECT Tabela1.ID

FROM Tabela1

INNER LOOP JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

GO

SELECT Tabela1.ID

FROM Tabela1

INNER MERGE JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

GO

SELECT Tabela1.ID

FROM Tabela1

INNER HASH JOIN Tabela2

  ON Tabela1.ID = Tabela2.ID

WHERE Tabela1.ID = 10

 

Fonte – Inside SQL Servr 2005: Query Tunning and Optimization.

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server

Indices

11 de dezembro de 2007 Deixe um comentário

Primeiramente quero agradecer ao Sanches pelas dicas sobre os Posts, Fiquem a vontade para me enviar criticas ou sugestões para posts.

 

Esta semana fiz uma alteração em uma tabela do no nosso banco de dados onde mudei a ordem das colunas do meu índice cluster, isso pode ser muito útil caso as consultas que são executadas nesta tabela tenham as colunas do índice cluster no where. Vamos a um exemplo prático.

 

–Vamos criar uma tabela para teste

drop table teste

create table teste (ID   Int Identity(1,1) NOT NULL,

                    Nome VarChar(200) NOT NULL,

                    Data DateTime)

 

alter table teste add constraint xpk_Nome_ID primary key (Nome, ID)

go

 

set nocount on

declare @i Int

set @i = 0

 

while @i < 1000

begin

  insert into teste (nome,data) values(‘A’, GetDate())

  insert into teste (nome,data) values(‘B’, GetDate())

  insert into teste (nome,data) values(‘C’, GetDate())

  insert into teste (nome,data) values(‘D’, GetDate())

  insert into teste (nome,data) values(‘E’, GetDate())

  set @i = @i + 1;

end

 

— Vamos imaginar a seguinte consulta

— Repare que o SQL não consegue fazer o seek porque a tabela está ordenada pela coluna Nome e não pela coluna ID

select * from teste

where id = 10

 

–Apaga a primary key

alter table teste drop constraint xpk_Nome_ID

GO

–Recria a primary key ordenado por ID e Nome

alter table teste add constraint xpk_ID_Nome primary key (ID, Nome)

 

— Ao executar a consulta novamente conseguimos um seek.

select * from teste

where id = 10

 

Claro que isso depende de um estudo bem feito das consultas que são executadas na sua tabela, bem como a alteração dos valores das colunas(UPDATE) porque uma má alteração poderia causar fragmentação na tabela, mas fragmentação é assunto para um outro post.

 

Valeu

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server

Statisticas e Plano de Execução

4 de dezembro de 2007 Deixe um comentário

Semana passada me deparei com um problema de performance de uma procedure chamada pela minha aplicação Win32 exibindo uma mensagem de TimeOut para o usuário. Somente após as estatísticas das tabelas serem atualizadas é que o processo conseguiu rodar.

 

Vamos analisar um pouco o problema.

 

Primeira pergunta: O que são e para que servem as estatísticas das tabelas?

 

O SQL Server guarda informações em relação aos registros das tabelas para que o Otimizador possa decidir qual o melhor plano de execução para uma determinada consulta baseado nos dados que ele lê nas statistics das tabelas.

Vamos a um exemplo:

 

use

MASTER

GO
create

database INSIDE

GO

–Altera a propriedade Auto_Update_Statistics para OFF

alter

database INSIDE set AUTO_UPDATE_STATISTICS off

GO
use

INSIDE

GO

–Vamos criar uma tabela para teste

drop

table teste

create

table teste (id Int Identity(1,1), Nome VarChar(200))

set

nocount on

declare

@i Int

set

@i = 0

while

@i < 1000

begin

insert into teste (nome) values(‘A’)
insert into teste (nome) values(‘B’)
insert into teste (nome) values(‘C’)
insert into teste (nome) values(‘D’)
insert into teste (nome) values(‘E’)
set @i = @i + 1;

end

while

@i < 10000

begin

insert into teste (nome) values(‘A’)
set @i = @i + 1;

end

create

index ix_teste on teste(nome)

–Vamos ver as Statistics criadas pelo indice

DBCC

SHOW_Statistics(teste, ix_teste)

— Faz um Table Scan pois ele lê nas Statistics que é o melhor meio de acesso aos dados, a consulta irá retornar 1000 registros
— Repare que na propriedade Estimeted Number Rows do Execution Plan o SQL já sabe quantas linhas a consulta irá retornar.

select

* from teste

where

nome = ‘A’

 

–Vamos incluir uma massa de dados para o valor X

declare

@i Int

set

@i = 0

while

@i < 10000

begin

insert into teste (nome) values(‘X’)
set @i = @i + 1;

end

— Repare que o SQL criou um novo plano de execução para a consulta abaixo. Sendo que ele deveria gerar um table scan como no primeiro SQL.
— ele não gerou porque as statistics estão desatualizadas repare que atualizando as statistics e executando a consulta novamente o SQL escolhe o melhor plano
— Podemos concluir que o deixar as statistics desatualizadas pode levar o otimizador a um mal plano de execução.
— Verificar a propriedade Estimeted Number Rows do Execution Plan.

select

* from teste

where

nome = ‘X’

–Vamos atualizar as statistics

UPDATE

STATISTICS teste

GO

–Faz um full Scan

select

* from teste

where

nome = ‘X’

 

 

Segunda pergunta: Como identificar o problema?

 

Identifiquei que o problema era um mal plano de execução gerado pelo SQL de uma consulta feita dentro da procedure que retornava os dados do processo.

Esta consulta fazia vários joins com tabelas com mais de 15 milhões de registros e o SQL Server estava fazendo um Index Scan em quase todas estas tabelas.

 

Rodei a procedure no SSMS com a opção para exibir o Plano de Execução (CTRL+M) ligada e tive o seguinte resultado.

 

 Plano de Execução

Observando a imagem acima podemos identificar que as querys 5  e 6 são responsáveis pelo gargalo da procedure então me limitei em analisar estas consultas.

 

Após analisar as consultas constatei que o SQL Server não estava gerando um bom plano de execução para as consultas já que ele estava gerando vários Index Scan ao invés de Seeks.

 

Terceira pergunta: Como resolver o problema?

Após identificar que o problema era o plano de execução temos várias maneiras de forçar o SQL Server a gera determinado plano por exemplo com o uso de Hints, no meu caso achei melhor criar um cursor e dentro de cada linha do cursor eu executo a instrução SQL mas passando uma condição bem restritiva no WHERE baseado no valor do cursor fazendo o SQL Server gerar um plano de execução com vários Seeks o que foi bem melhor que apenas um Index Scan.

 

Fiz mais outras alterações como trocar os DataTypes das tabelas temporárias usadas na procedure DateTime para SmallDateTime, Int para SmallInt ou TyniInt, SET NOCOUNT ON dentre outros, mas o ideal é sempre melhorar o gargalo.

 

A melhora foi muito grande, vamos analisar os resultados no profiler.

 

 Profiler

Conclusão de 2:20 minutos para 0. J

 

Verificamos então como identificar o problema, fica a dica sobre Statistics e a analise dos planos de execução utilizando o CTRL-M, é claro que isso não funciona sempre mas ajuda.

 

__________________________________________________________________
Fabiano Neves Amorim (MCP – MCTS – SQL Server)
Análise – NewCon Enterprise
* fabiano@cnpm.com.br – http://fabianosqlserver.spaces.live.com/

( (55 – 14) 3404-3700

Categorias:SQL Server

Primeiro Post

30 de novembro de 2007 1 comentário

Meu primeiro Post no Blog.

 

Senhoras e senhores, inicia aqui mais um Blog sobre tecnologia, mais especificamente sobre SQL Server.

 

Minha intenção é colocar no blog dicas sobre o uso do SQL Server e fatos do dia a dia que podem ser de interesse dos leitores.

Sem mais delongas vamos ao que interessa SQL. 🙂

 

Vai aqui uma dica muito boa para quem trabalha com o SQL e pode ser útil do dia a dia.

 

–Vamos criar uma tabela de exemplo

IF Object_ID(‘teste’) ISNOTNULL

  DROPTABLE teste

GO

CREATETABLE teste (ID   Int Identity(1,1),

                    Nome VarChar(200))

GO

 

— Agora digamos que eu queira incluir 10 registros nesta tabela, temos várias formas de fazer isso

— o mais comum de vermos nos sites por ai é:

 

DECLARE @i Int

SET @i = 0

WHILE @i < 10

BEGIN

  INSERTINTO teste VALUES(NewID())

  SET @i = @i + 1

END

go

 

— Agora vamos ver uma forma mais simples.

IF Object_ID(‘teste’) ISNOTNULL

  DROPTABLE teste

GO

CREATETABLE teste (ID   Int Identity(1,1),

                    Nome VarChar(200))

 

GO

— Usando o GO 10 o comando Insert será executavo 10 vezes.

INSERTINTO teste VALUES(NewID())

GO 10

 

Para quem está começando no SQL Server aqui vão algumas explicações sobre alguns comandos acima que podem ser desconhecidos.

 

1.       NewID() é uma função que retorna um conjunto de caracteres aleatórios.

 

2.       Obeject_ID() retorna o ObjectID de um determinado objeto no nosso exemplo a tabela teste. Esta informação está gravada na tabela sysobjects do SQL Server 2000 ou sys.objects do SQL Server 2005.

 

Por hoje é só, espero nos ajudar na nossa jornada SQL Server.

 

Observação: O “GO 10” Só funciona no SQL Server Managmente Studio.
Categorias:SQL Server, T-SQL