de Volta para: O SQL Server Tutorial Para Iniciantes e Profissionais
RaiseError no SQL Server com o Exemplo
neste artigo, Eu estou indo para discutir o RaiseError no SQL Server e, junto com o @@ERRO usando um real exemplo de tempo. Por favor, leia o nosso artigo anterior antes de prosseguir para este artigo onde discutimos os princípios básicos de tratamento de exceções no servidor SQL com alguns exemplos.,
por favor use o script abaixo de SQL para criar e povoar a tabela de produtos e produtos com alguns dados de teste.
SELECT * FROM Produto vai nos dar a abaixo de saída
Criar o procedimento armazenado seguinte para a venda do produto.
CREATE PROCEDURE spSellProduct@ProductID INT,@QuantityToSell INTASBEGIN -- First we need to Check the stock available for the product we want to sell DECLARE @StockAvailable INT SELECT @StockAvailable = QuantityAvailable FROM Product WHERE ProductId = @ProductId -- We need to throw an error to the calling application -- if the stock is less than the quantity we want to sell IF(@StockAvailable< @QuantityToSell) BEGIN Raiserror('Enough Stock is not available',16,1) END -- If enough stock is available ELSE BEGIN -- We need to start the transaction BEGIN TRANSACTION -- First we need to reduce the quantity available UPDATEProduct SET QuantityAvailable = (QuantityAvailable - @QuantityToSell) WHEREProductID = @ProductID -- Calculate MAX ProductSalesId DECLARE @MaxProductSalesId INT SELECT@MaxProductSalesId = CASE WHEN MAX(ProductSalesId) IS NULL THEN 0 ELSE MAX(ProductSalesId) END FROM ProductSales-- Increment @MaxProductSalesId by 1, so we don't get a primary key violationSet @MaxProductSalesId = @MaxProductSalesId + 1 -- We need to insert the quantity sold into the ProductSales table INSERT INTO ProductSales(ProductSalesId, ProductId, QuantitySold) VALUES(@MaxProductSalesId, @ProductId, @QuantityToSell) COMMIT TRANSACTION EndEND
the above-stored procedure accepts 2 parameters – ProductID and QuantityToSell., O parâmetro ProductID especifica o produto que queremos vender e o parâmetro QuantityToSell especifica a quantidade que queremos vender.
O problema com o acima-procedimento armazenado é de que a transação é sempre vai ser cometido, mesmo que há um erro em algum lugar entre a atualização da tabela de Produtos e inseri-lo no ProductSales tabela.,
o principal objectivo de embrulhar estas duas declarações (actualizar a declaração do produto & inserir na declaração ProductSales) numa transacção é assegurar que ambas as declarações sejam tratadas como uma única unidade.
por exemplo, se tivermos um erro ao executar a segunda declaração, então a primeira declaração deve ser enrolada para trás.,
ALTER PROCEDURE spSellProduct@ProductID INT,@QuantityToSell INTASBEGIN -- First we need to Check the stock available for the product we want to sell DECLARE @StockAvailable INT SELECT @StockAvailable = QuantityAvailable FROM Product WHERE ProductId = @ProductId -- We need to throw an error to the calling application -- if the stock is less than the quantity we want to sell IF(@StockAvailable< @QuantityToSell) BEGIN Raiserror('Enough Stock is not available',16,1) END -- If enough stock is available ELSE BEGIN -- We need to start the transaction BEGIN TRANSACTION -- First we need to reduce the quantity available UPDATEProduct SET QuantityAvailable = (QuantityAvailable - @QuantityToSell) WHEREProductID = @ProductID -- Calculate MAX ProductSalesId DECLARE @MaxProductSalesId INT SELECT@MaxProductSalesId = CASE WHEN MAX(ProductSalesId) IS NULL THEN 0 ELSE MAX(ProductSalesId) END FROM ProductSales-- Increment @MaxProductSalesId by 1, so we don't get a primary key violationSet @MaxProductSalesId = @MaxProductSalesId + 1 -- We need to insert the quantity sold into the ProductSales table INSERT INTO ProductSales(ProductSalesId, ProductId, QuantitySold) VALUES(@MaxProductSalesId, @ProductId, @QuantityToSell) -- The @@Error returns a NON-ZERO value if there is an error, otherwise it will return ZERO, -- indicating that the previous SQL statement encountered no errors IF(@@ERROR <> 0) BEGIN ROLLBACK TRANSACTION PRINT 'Rolled Back the Transaction' END ELSE BEGIN COMMIT TRANSACTION PRINT 'Committed the Transaction' END EndEND
No procedimento acima, se você comentar a linha (Set @MaxProductSalesId = @MaxProductSalesId + 1) e, em seguida, executar o procedimento armazenado não será uma violação de chave primária de erro quando tentar inserir no ProductSales tabela como um resultado do qual toda a transação será revertida.
Nota:
o erro @@é limpo e reiniciado em cada execução da instrução. Assinale-o imediatamente após a verificação da declaração, ou grave-o numa variável local que possa ser verificada mais tarde.,
na tabela de produtos, nós já temos um registro com ProductID = 4. Então a instrução inserir causa um erro de violação de chave primária. O erro @@retém o número de erro, como estamos verificando para ele imediatamente após a declaração que causa o erro.
INSERT INTO Product values(4, 'Mobile Phone', 1500, 100)IF(@@ERROR <> 0) PRINT 'Error Occurred'ELSE PRINT 'No Errors'
por outro lado, quando você executar o código abaixo, você receberá a mensagem “Sem Erros”. Isto ocorre porque o erro @@é limpo e reiniciado em cada execução de declaração.,
No exemplo abaixo, estamos armazenando o valor de @@função de Erro para uma variável local, que é usado mais tarde.
No próximo artigo, vou discutir como aumentar os erros explicitamente no SQL Server e também vamos discutir as diferentes opções que podemos usar com função Raiserror. Aqui, neste artigo, eu tento explicar o RaiseError no servidor SQL junto com @@erro passo a passo com alguns exemplos.