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.