"INSERT EXEC ha esito negativo perché la stored procedure ha modificato lo schema della tabella di destinazione" in SQL Server 2016
Questo articolo consente di risolvere un problema che si verifica perché una stored procedure in un database che usa la funzionalità Archivio dati query non riesce periodicamente.
Versione originale del prodotto: SQL Server 2016
Numero KB originale: 4465511
Sintomi
Prendi in considerazione lo scenario seguente:
Si dispone di un database di Microsoft SQL Server 2016 che usa la funzionalità Archivio dati query.
Si dispone di una stored procedure che effettua una chiamata a un'altra stored procedure usando la
INSERT...EXEC
sintassi .La funzionalità Archivio dati query esegue periodicamente la pulizia automatica man mano che aumenta le dimensioni massime configurate. Inoltre, lo stato dell'archivio dati query passa da
READ_WRITE
aREAD_ONLY
.
In questo scenario l'esecuzione periodica della stored procedure padre ha esito negativo e viene visualizzato un messaggio di errore simile al seguente:
Msg 556, Level 16, State 2, LineNumber
INSERT EXEC non riuscita. La stored procedure ha modificato lo schema della tabella di destinazione.
Causa
Il processo di pulizia automatica scarica il piano dall'archivio dati di query. La query rileva un'operazione di ricompilazione perché il piano non è presente in Query Data Store. Tuttavia, il piano è ancora presente nella cache delle procedure. Per impostazione predefinita, quando si verifica l'operazione di ricompilazione, SQL Server genera l'errore 556 per impedire l'esecuzione duplicata della routine figlio. Un'operazione duplicata di questo tipo causerebbe la restituzione di risultati non corretti.
Risoluzione
Informazioni sul Service Pack per SQL Server 2016
Questo problema è stato risolto nel Service Pack seguente per SQL Server:
Service Pack 3 per SQL Server 2016
Informazioni sui Service Pack per SQL Server:
I Service Pack sono cumulativi. Ogni nuovo Service Pack contiene tutte le correzioni contenute nei Service Pack precedenti, insieme a eventuali nuove correzioni. È consigliabile applicare il Service Pack più recente e l'aggiornamento cumulativo più recente per tale Service Pack. Non è necessario installare un Service Pack precedente prima di installare il Service Pack più recente. Per altre informazioni sul Service Pack più recente e sull'aggiornamento cumulativo più recente, vedere la tabella 1 nell'articolo seguente:
Soluzione alternativa
Per risolvere il problema, seguire questa procedura:
Aumentare le dimensioni dell'archivio dati query. In questo modo si ridurrà la frequenza o la probabilità che Query Data Store cancella il piano e entri in
READ_ONLY
modalità operativa.Aggiungere la gestione degli errori al codice per rilevare l'errore 556 e quindi inviare di nuovo la
INSERT EXEC
query.Cancellare la cache delle procedure quando Query Data Store torna allo
READ_WRITE
stato daREAD_ONLY
.
Informazioni aggiuntive
A causa delle modifiche apportate a Query Data Store in Microsoft SQL Server 2017, questo problema non si verifica in SQL Server 2017.