Alteração de schema de tabelas no SQL Server

Ás vezes há a necessidade de mudar esquema de todas as tabelas, para aqueles que utilizam SQL Server e, como eu. Estão (ou estavam) tentando achar uma maneira de como alterar o schema de uma tabela sem precisar recriá-la no schema novo e fazer a transferência dos dados. Eis a solução perfeita para essa tarefa.
A tarefa de alterar o schema da tabela no SQL Server é um pouco diferente na versão 2000 em relação às versões 2005 e 2008:

Alterando schema de tabela no SQL Server 2000

DECLARE tabcurs CURSOR
FOR
    SELECT 'SOMEOWNER.' + [name]
      FROM sysobjects
     WHERE xtype = 'u'
 
OPEN tabcurs
DECLARE @tname NVARCHAR(517)
FETCH NEXT FROM tabcurs INTO @tname
 
WHILE @@fetch_status = 0
BEGIN
 
    EXEC sp_changeobjectowner @tname, 'dbo'
 
    FETCH NEXT FROM tabcurs INTO @tname
END
CLOSE tabcurs
DEALLOCATE tabcurs

No código acima o as tabelas do atual schema “SOMEOWNER” serão transferidas pra o “dbo”.

Alterando schema de tabela no SQL Server 2005 e 2008

-- Quebramos a linha pra facilitar a leitura!
ALTER SCHEMA '[nome_schema_novo]'
TRANSFER '[nome_schema_antigo]'.'[tabela_que_mudará_de_schema]';

Exemplo:

ALTER SCHEMA 'cadastro' TRANSFER 'dbo'.'cliente';

Fonte: Anatoly Lubarsky e MSDN Microsoft Librasy.


Alternativa para o @@IDENTITY no SQL Server 2000

Ultimamente tive problemas com a instrução @@IDENTITY, para retornar a PRIMARY KEY de um registro inserido, na criação de SP (Stored Procedure) .

Identifiquei as seguintes alternativas:
para SQL Server versões 2000 ou superior.

“Instruções SQL que estão contidos no mesmo lote, Stored Procedure ou Trigger são considerados no mesmo escopo. Então, se eu chamar um INSERT que aciona um gatilho, eu tenho dois âmbitos diferentes: âmbito de aplicação 1 está dentro do lote que chamado de INSERT e escopo dois está dentro da trigger.”

SELECT @@IDENTITY
Esta é a função favorita de todos, sem alteração de versões anteriores do SQL Server. É esta uma Função favorita de Todos, sem alteração Anteriores de versões do SQL Server. Ele retorna o valor de identidade último produzido em uma ligação, independentemente do quadro que produziu o valor, independentemente do âmbito de aplicação da declaração de que o valor produzido. Ele retorna uma ÚLTIMA IDENTITY Produzido em valor Uma Conexão, independentemente do valor o Quadro Que produziu, independentemente do Âmbito de Aplicação da DECLARAÇÃO de Produzido Que o valor.

SELECT IDENT_CURRENT (‘TableName’)
Esta nova função retorna o último valor de identidade produzidos em uma tabela, independentemente da ligação que criou o valor, independentemente do âmbito de aplicação da declaração de que o valor produzido. This nova Função retorna o ultimo valor IDENTITY Produzido em Uma tabela, independentemente da LigAção Que Criou o valor, independentemente do Âmbito de Aplicação da DECLARAÇÃO de Produzido Que o valor.

SELECT SCOPE_IDENTITY()
Esta nova função retorna o último valor de identidade produzidos em uma ligação e de uma declaração no mesmo âmbito, independentemente do quadro que produziu o valor. This nova Função retorna o ultimo valor IDENTITY Produzido em Conexão Uma e Uma DECLARAÇÃO No mesmo âmbito, independentemente do valor o Quadro Que produziu. Sugira uma tradução melhor.

 

Considerando as tabelas:

CREATE TABLE YakName (ID INT IDENTITY(1,1), YakName VARCHAR(30))
CREATE TABLE YakTracker (ID INT IDENTITY(1000,1), TranType CHAR(1), YakName VARCHAR(30))
GO

Podemos obter o IDENTIRY com as seguintes instruções:

CREATE TRIGGER tI_Yak ON YakName FOR INSERT
AS
BEGIN
    INSERT YakTracker (TranType, YakName)
    SELECT 'I',YakName FROM inserted
END
GO

fonte: Mark em SQL Team.com

Stored Procedure (SP) com WHERE opcionais

Outra forma que tratar condições na cláusula WHERE no SQL Server 2000 ou 2005, é a seguinte:

CREATE PROCEDURE SP_CONSULTA
 /* define o parâmetro obrigatório */
 @UF VARCHAR(100),
 /* define o parâmetro opcional - o valor default de ver igual a "null" */
 @CIDADE VARCHAR(100)  = NULL
AS
BEGIN
 /* declara a variável que receberá a instrução SQL */
 DECLARE @strSQL VARCHAR(5000)
 /* cria a primeira parte da instrução SQL */
 SET @strSQL = 'SELECT * FROM TB_CIDADE WHERE UF = ''' + @UF + ''''
 
 /* verifica se o parâmetro opcional não é nulo */
 IF @CIDADE IS NOT NULL 
      BEGIN
  /* se a condição for verdadeira, concatena o parâmetro opcional */
  SET @strSQL = @strSQL + ' AND NOME_CIDADE = ''' + @CIDADE + ''''
 END
 
 /* executa a instrução SQL na variável @strSQL */
 EXEC(@strSQL)
 RETURN(0)
END

SQL – CASE no WHERE

Me deparei com um problema: Como fazer um CASE (comendo SQL) na clausula WHERE.

Resolvi o problema e decidi post aqui na sintaxe do SQL Server 2000 ou 2005

DECLARE @tipo VARCHAR(50);
DECLARE @estado VARCHAR(5);
DECLARE @ativo VARCHAR(10);
 
SET @estado = '53';
SET @ativo = 'SIM';
 
SELECT
    *
FROM
    cas_municipio
WHERE MUN_EST_CODIGO = 
	CASE
		WHEN @estado <> '' THEN @estado
	END 
	AND	MUN_ATIVO LIKE
	CASE
		WHEN @ATIVO <> 'N' THEN '%S'
	END

Sendo …

WHERE MUN_EST_CODIGO =

é o campo da tabela a ser comparado.

Quaquer dúvida é só comentar.
Abraço a todos.