Tenho um procedimento armazenado que insere algumas linhas em uma tabela. Às vezes parece falhar (não consigo encontrar os novos registros), embora eu saiba que as instruções foram executadas. O código que uso está abaixo. Depois de executá-lo, posso encontrar as linhas relevantes na tabela tbl_DebugLog, mas não na tabela tbl_WebSiteNotifications. Estou usando o SQL Server 15.0.2. Além disso, esta tabela faz parte de uma replicação de mesclagem. O que pode causar isso?
insert into tbl_WebSiteNotifications(NotificationType, FileID, UserID, SubscriptionID, InsertionDate)
select RequestType, FileID, UserID, SubscriptionID, DateRequested
from #TempNotifications
where UserID is not null
insert into tbl_DebugLog (LogDate, LogMessage, ServerName)
select getdate(), 'FileID ' + format(FileID,'D') + N' for SubscriptionID ' + format (SubscriptionID,'D') + N' Inserted into tbl_WebSiteNotifications' +
', NotificationType=' + format(RequestType,'D') +
', UserID=' + format(UserID,'D') +
', InsertionDate=' + format(DateRequested,'dd-MM-yyyy'),
@@SERVERNAME
from #TempNotifications
where UserID is not null
Uma falha de inserção dentro de um procedimento não interromperá o procedimento por padrão. Se você quiser que ele pare, defina
XACT_ABORT
no início do procedimentoSET XACT_ABORT ON
para que a primeira inserção falhe no procedimento.Por exemplo, este código chegará ao select
E definir
XACT_ABORT ON
, fará com que pare no erro na segunda inserção.Consulte SET XACT_ABORT (Transact-SQL) na documentação.
A causa provavelmente é alguma violação de restrição.
Por que você não vê o erro sobre isso é uma questão mais difícil. Essas duas declarações em partes diferentes de SP estão cercadas por
try ... catch
? Existe uma lógica condicional que pode chamar a segunda instrução sem executar a primeira?Como você executa esse procedimento armazenado? É chamado de algum cliente? Oculta mensagens de aviso "irrelevantes"?
Você tem
SET NOCOUNT ON
em seu SP? Remova-o e execute o SP de um cliente que imprime todas essas mensagens "lixo" - elas são muito úteis em casos como o seu.Se você não gosta de mensagens da
nocount
opção, você pode colocar bastanteprint "insert into tbl processed " + cast(@@rowcount as varchar(20))
entre suas declarações.