Novas funcionalidades em T-SQL no SQL Server 2008

Gentes,
 
Está para terminar a intensiva de posts sobre SQL Server 2008.
 
Já não sou mais programador, mas com certeza essas novas funcionalidades iriam me ajudar no passado.
Para a sorte de vocês (!!!), usem estas novidades (sem moderação).
 

Declarando e inicializando variáveis na mesma linha

 
DECLARE @i AS INT = 0, @d AS DATETIME = CURRENT_TIMESTAMP;
SELECT @i AS [@i], @d AS [@d];
 

Operadores de atribuição compostos:

 
O SQL Server 2008 agora suporta:
+= (plus equals)
-=  (minus equals)
*=  (multiplication equals)
/=  (division equals)
%=  (modulo equals)
 
Exemplo:
DECLARE @price AS MONEY = 10.00;
SET @price += 2.00;
SELECT @price;
INSERT com VALUES mais flexível:
INSERT INTO dbo.Customers(custid, companyname, phone, address)
  VALUES
  (1, ‘cust 1’, ‘(111) 111-1111’, ‘address 1’),
  (2, ‘cust 2’, ‘(222) 222-2222’, ‘address 2’),
  (3, ‘cust 3’, ‘(333) 333-3333’, ‘address 3’),
  (4, ‘cust 4’, ‘(444) 444-4444’, ‘address 4’),
  (5, ‘cust 5’, ‘(555) 555-5555’, ‘address 5’);
 
Obs.: o comando INSERT é atômico; se houver uma falha em uma das linhas, a operação inteira falha.
 
Novos tipos de dados para DATA e HORA:
 
  • DATE (3 bytes)
    January 1, 0001 through December 31, 9999, com precisão de 1 dia
  • TIME (3 a 5 bytes)
    Somente hora; precisão de 100 nanosegundos
  • DATETIME2 (6 a 8)
    January 1, 0001, through December 31, 9999;precisão de 100 nanosegundos
  • DATETIMEOFFSET (8 a 10)
    January 1, 0001, through December 31, 9999;precisão de 100 nanosegundos; armazena informações de fuso horário (diferença UTC)
 

Tipo de dados TABLE

 
Definição de tabela em uma variável.
Exemplo:
CREATE TYPE dbo.OrderIDs AS TABLE
(
pos INT NOT NULL PRIMARY KEY,
orderid INT NOT NULL UNIQUE
);
DECLARE @T AS dbo.OrderIDs;
INSERT INTO @T(pos, orderid) VALUES(1, 51480),(2, 51973),(3, 51819);
SELECT pos, orderid FROM @T ORDER BY pos;
 

Comando MERGE

 
Combina INSERT, UPDATE e DELETE em um comando único.
Usando as chaves de uma tabela, insere novos registros e atualiza já existentes.
MERGE INTO dbo.Customers AS TGT
USING dbo.CustomersStage AS SRC
  ON TGT.custid = SRC.custid
WHEN MATCHED THEN
  UPDATE SET
    TGT.companyname = SRC.companyname,
    TGT.phone = SRC.phone,
    TGT.address = SRC.address
WHEN NOT MATCHED THEN
  INSERT (custid, companyname, phone, address)
  VALUES (SRC.custid, SRC.companyname, SRC.phone, SRC.address)
WHEN NOT MATCHED BY SOURCE THEN
  DELETE
OUTPUT
  $action, deleted.custid AS del_custid, inserted.custid AS ins_custid;

Colunas do tipo SPARSE

 
São otimizadas para armazenar NULLs; ou seja: não ocupam espaço, mesmo se a definição indica tamanho fixo (char(50), por exemplo).
Pode-se usar um COLUMN SET para retornar como XML todas colunas do tipo SPARSE:
CREATE TABLE dbo.T1
(
  keycol INT                   NOT NULL PRIMARY KEY,
  col1   VARCHAR(20)           NOT NULL,
  col2   INT            SPARSE     NULL,
  col3   CHAR(10)       SPARSE     NULL,
  col4   NUMERIC(12, 2) SPARSE     NULL,
  cs     XML column_set FOR ALL_SPARSE_COLUMNS
);
 

Filtered Indexes

CREATE NONCLUSTERED INDEX idx_currate_notnull
  ON Sales.SalesOrderHeader(CurrencyRateID)
  WHERE CurrencyRateID IS NOT NULL;
Fonte:
Introduction to New T-SQL Programmability Features in SQL Server 2008
http://technet.microsoft.com/en-gb/library/cc721270(SQL.100).aspx
 
Anúncios

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s