As
variáveis globais @@ERROR e @@IDENTITY são utilizadas para retornar o
valor do erro e o valor do último id de um campo identity
respectivamente. Logo abaixo falo um pouco sobre como utilizá-las.
A variável global @@ERROR é usada em
Stored Procedures, Batch e Triggers. Ela retorna zero se o último comando
Transact-SQL e executado com sucesso. Se o comando causar algum erro, a
função @@ERROR retorna o número deste erro. Como o @@ERROR retorna um
valor para cada comando SQL, então você deve testar com um comando if ..
then o valor do @@ERROR logo após a execução do comando SQL e
guardar este valor dentro de uma variável do tipo Integer dentro da sua
Stored Procedure.
O @@ERROR pode ser usado por exemplo para
indicar o sucesso ou falha de uma Stored Procedure. No exemplo abaixo, uma
variável é declarada e inicializada com 0. Depois
da execução de cada comando
SQL, o @@ERROR é testado, se for <> 0, é porque aconteceu algum
erro durante a execução do comando, então o valor deste erro é
atribuido à variável @ErrorSave. No fim da execução, a variável
@ErrorSave conterá o valor do último erro gerado na execução da
Strored Procedure, senão conterá o valor 0 indicando que os comandos
foram executado com sucesso.
USE Northwind
GO
DROP PROCEDURE SampleProcedure
GO
--*** Stored Procedure com um parâmetro output que
retorna o código
--*** do erro gerado na execução, ou zero se não
houver erro
CREATE PROCEDURE SampleProcedure
@EmployeeIDParm INT,
@MaxQuantity INT OUTPUT
AS
-- Declaração da variável que conterá o número do
erro
DECLARE @ErrorSave INT
SET @ErrorSave = 0
SELECT FirstName, LastName, Title
FROM Employees
WHERE EmployeeID = @EmployeeIDParm
IF (@@Error <> 0)
SET @ErrorSave = @@Error @@ERROR
-- Atribuindo o valor para o parâmetro OUTPUT
SELECT @MaxQuantity = MAX(Quantity)
FROM [Order Details]
IF (@@Error <> 0)
SET @ErrorSave = @@Error @
@ERROR
-- Retorna 0 se nenhum erro ocorreu, senão
-- retorna o valor do erro para na úlitma transação
RETURN @ErrorSave
GO
Usando @@IDENTITY
O @@IDENTITY é usado para retornar o útlimo
valor gerado pelo campo contador (Identity) do SQL Server.
Depois de um INSERT, o @@IDENTITY contem
o último valor do ID gerado. Se o comando SQL for feito sobre uma tabela
que não contenha um campo do tipo IDENTITY, o valor retornado é o NULL.
Se forem inseridas multiplas linhas, gerando multiplos valores identity,
@@IDENTITY retorna o último valor gerado. Se o comando dispara uma ou
mais TRIGGERS que executam comandos INSERT que gerem valores IDENTITY,
chamando @@IDENTITY imediatamente após você obterá o último valor
gerado pela trigger.
Neste exemplo, estou inserindo um
registro na tabela Jobs. Logo depois eu posso usar o @@IDENTITY para saber
qual o valor do ID gerado neste INSERT.
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @@IDENTITY AS 'Identity'
Como no exemplo do @@Error,
dentro de uma Stored Procedure eu poderia atribuir o valor do @@IDENTITY
para uma variável do tipo inteiro, e usá-lo em um outro comando SQL
subsequente, ou então retorná-lo através de um parâmetro Output para a
aplicação Delphi.
CREATE PROCEDURE Teste
AS
DECLARE @idJobs INT
INSERT INTO jobs (job_desc,min_lvl,max_lvl)
VALUES ('Accountant',12,125)
SELECT @idJobs = @@Identity
INSERT INTO Tabela(idJob, Campo2, Campo3)
VALUES (@idJobs, 'String2', 'String3')