Condividi tramite


"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 a READ_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:

Come determinare la versione, l'edizione e il livello di aggiornamento di SQL Server e dei relativi componenti

Soluzione alternativa

Per risolvere il problema, seguire questa procedura:

  1. 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.

  2. Aggiungere la gestione degli errori al codice per rilevare l'errore 556 e quindi inviare di nuovo la INSERT EXEC query.

  3. Cancellare la cache delle procedure quando Query Data Store torna allo READ_WRITE stato da READ_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.