2015-01-17 13 views
17

Ho due server connessi su una velocità bassa wan e stiamo eseguendo SQL Server 2008 con la replica di tipo Merge.Un trigger ha restituito un set di risultati e/o era in esecuzione con SET NOCOUNT OFF mentre era attivo un altro set di risultati eccezionale

Al sottoscrittore, a volte quando si tenta di inserire nuove righe, ottengo questo errore:

A trigger returned a resultset and/or was running with SET NOCOUNT OFF while another outstanding result set was active.

  • mio database non ha trigger; gli unici trigger sono quello creato dalla replica di unione
  • Inoltre, ogni volta che questo errore si verifica automaticamente ripristina la transazione esistente
  • Sto usando DataTables e TableAdapters da inserire e aggiornare il database utilizzando le transazioni

Quello che ho controllato:

  1. la dimensione del file di registro del database è inferiore a 50Mb
  2. controllato il codice sorgente per le operazioni di Zombie (Dal momento che non ero in grado di recuperare l'errore effettivo all'inizio)
  3. controllato la connessione tra i due server e hanno trovato congestionata

Domande:

  1. Come evitare questo comportamento e perché si sta verificando al primo posto?
  2. Perché sta annullando la transazione aperta?

risposta

3

Il trigger restituisce un "set di risultati" di ordinamento, il numero di righe interessate. "(1 riga/e interessata) // o n righe ...." Non so perché questo viene interpretato come un set di risultati, ma lo è.

Ho avuto un problema simile oggi e ho capito che questo problema può essere risolto mettendo un SET NOCOUNT OFF verso la fine del trigger. Non è sufficiente avere SET NOCOUNT ON nella parte superiore del trigger.

Il trigger a cui mi riferisco è l'istruzione "insert" preimpostata nell'applicazione. È molto probabile che l'affermazione abbia generato l'errore SQL.

Ora è possibile utilizzare sp_configure 'disallow results from triggers' 1, ma, questo lo disabiliterà per l'intero database e potrebbe non essere consigliabile, nel caso in cui ci si aspetti un altro trigger per restituire un set di risultati.

L'OP dello Source ho utilizzato descritto lo stesso identico problema riscontrato se la mia risposta non è sufficiente. Inoltre, MSDN aveva detto

The ability to return result sets from triggers will be removed in a future version of SQL Server. Avoid returning result sets from triggers in new development work, and plan to modify applications that currently do this. To prevent triggers from returning result sets in SQL Server 2005, set the disallow results from triggers Option to 1. The default setting of this option will be 1 in a future version of SQL Server.

0

Ho lo stesso problema e ho una soluzione.

Il problema era un stored procedure con un set di risultati, che è stato eseguito in questo trigger.

Sembra che questa stored procedure conduca il trigger ad avere anche un set di risultati.

0

Ho avuto lo stesso problema.

Il problema era un inserto con selezionare:

insert into table (...) 
select ... 

Il problema era che selezionare aveva un affermazioni gruppo e ha restituito:

Warning: Null value is eliminated by an aggregate or other SET operation.

questa la causa del problema, ho cambiato le istruzioni max(field) da max(coalesce(field,'')) a evitare l'operazione nulla nella funzione di gruppo massima.