2009-07-16 6 views
8

Sono bloccato in un modo piuttosto strano problema con SQL Server 2005, che gettaSet Identifier QUOTED dovrebbe essere su quando si inserisce un record

"Set Identifier QUOTED dovrebbe essere su quando si inserisce record"

(utilizza come SP) per la tabella specifica. Questo ha funzionato bene, ma sta generando questo errore in modo casuale.

Ho verificato la SP. Non abbiamo specificato manualmente le impostazioni SET QUOTED IDENTIFIER, quindi deve essere ON di default.

Qualcuno può chiarire quale potrebbe essere il problema?

La tabella deve essere creata con SET QUOTED IDENTIFIER ON right? Non ho ancora controllato lo script del tavolo.

Ho osservato che questo problema si verifica solo con gli SP che eseguono l'inserimento o l'aggiornamento su una colonna di date (modifiedAt) ... Un valore di esempio è '2009-08-10 06: 43: 59: 447' ..

C'è un problema con i valori passati?

risposta

23

Dopo una lunga battaglia siamo riusciti a risolvere questo problema. Volevo solo condividere la ragione.

Il nostro team di build gestisce internamente lo strumento interno separato per la distribuzione degli script, che attiva internamente l'utilità SQLCMD (shell) per eseguire gli script in un db.

qui il colpevole ... da QUOTED_IDENTIFIER predefinita è Off in SQLCMD.

Ogni script eseguito attraverso questo strumento viene creato senza IDENTIFICATORE COTTO. Siamo l'unico modulo che utilizza viste indicizzate. Tutte le altre storie che conosci bene nei miei post precedenti :(

NOTA:. ho intenzione di votare il post di tutti come utile

+3

Mi hai appena salvato almeno un'ora di caccia in giro --- non avrei mai immaginato che SQLCMD lo stessero facendo. Grazie per l'aggiunta di questo chiarimento –

+2

grande ... ho faticato con questo problema per nealry una settimana .. è un dannato errore semplice .. ho pensato che questo potrebbe essere utile per qualcuno .. sono molto contento che ti abbia aiutato ... :) – RameshVel

+1

Idem sui commenti di @Ralph Shillington. –

1

In SQL Server 2005, SET QUOTED IDENTIFIER è OFF per impostazione predefinita, non ON (a meno che non si utilizzi una connessione ODBC o OLE ... vedere this per ulteriori informazioni).

Non è necessario creare la tabella con SET QUOTED IDENTIFIER ON per utilizzarlo.

Tutto quello che devi fare è aggiungere SET QUOTED IDENTIFIER ON all'inizio del tuo SP per abilitarlo per l'esecuzione della procedura (e assicurarti che se non vuoi lasciarlo acceso, hai SET QUOTED IDENTIFICATORE OFF per tornare indietro).

EDIT

mi correggo. Secondo questa MSDN Page, Set Identifier QUOTED è attivato per default (a meno che il collegamento con un'applicazione DB-Library.

+0

mi riferivo questa pagina ... http://msdn.microsoft .com/it/us/library/ms174393 (SQL.90) .aspx .. dice on dafault .. – RameshVel

+0

effettivamente dint applica SET QUOTED IDENTIFIER ON in qualsiasi delle tue SP. tutte le sp nel db creatd in quel modo .. solo il particolare insert sp sulla tabella specifica genera questo errore ... potremmo facilmente risolvere questo se questo si verifica sempre ... il suo schierato una settimana fa, funzionava bene fino ad oggi .. e improvvisamente dando questo problema .. qualche idea del perché questo si comporti come thi s ... – RameshVel

+0

Assicurati di non creare dinamicamente query SQL nella stored procedure. Ciò potrebbe portare ad alcuni dati inseriti dall'utente con virgolette da inserire nella query.Quando SQL Server tenta di eseguire la query ... si otterrà quell'errore. –

1

Stavo leggendo questo articolo di Erland Sommarskog, The Curse and Blessings of Dynamic SQL, e comprende il seguente paragrafo per quanto riguarda SET Citato impostazione IDENTIFIER:.

il predefinito per questa impostazione dipende dal contesto, ma l'impostazione preferita è oN, e deve essere oN per usare XQuery, indicizzato viste e indici su colonne calcolate

La procedura memorizzata utilizza XQuery, viste indicizzate o indici su colonne calcolate?

+0

grazie per la risposta Amal, non usiamo XQuery o altre caratteristiche .. è solo un semplice insert & update sp .. e non ha nessuna vista indicizzata anche ... – RameshVel

5

Script il proc memorizzato, verificare/modificare le opzioni SET, eseguire ALTER PROC per assicurarsi che SET QUOTED IDENTIFIER ON sia impostato.

Perché?

L'impostazione di "SET QUOTED IDENTIFIER" è definita al momento della creazione per i proc memorizzati ed è sempre "ON" per le tabelle. Source, BOL.

Quando si crea una tabella, l'opzione QUOTED identificatore è sempre memorizzato come ON nei metadati della tabella anche se l'opzione è impostata su OFF quando la tabella è creato.

Quando viene creata una stored procedure, SET QUOTED_IDENTIFIER e SET ansi_nulls impostazioni vengono catturati e utilizzati per le successive invocazioni di stored procedure.

Il valore predefinito per le connessioni può essere definito a livello di server (sp_configure 'opzioni utente') o livello di database (ALTER DATABASE). Per SSMS, è in "Strumenti ... Opzioni ... Query Execution..SQL Server..ANSI". È anche l'impostazione predefinita per le librerie client (eccetto DB-LIb).

Ora si apre una finestra di query SSMS e si inizia a digitare "CREA PROC ..", quindi utilizza le impostazioni SSMS quando si esegue il codice.

E Set Identifier QUOTED non può essere impostata in fase di esecuzione all'interno del proc memorizzato. Mostrami il riferimento prima di disaccordo ... Dal link MS BOL sopra:

Quando viene eseguito all'interno di una stored procedure , l'impostazione di SET QUOTED_IDENTIFIER non viene modificato.

È necessario lavorare sodo per eseguire qualsiasi codice con questo OFF ... quindi la soluzione più probabile è quella di ALTER o ricreare il proc memorizzato.

+0

hi gbn ho allegato i dati di esempio , puoi vederlo in questo ... – RameshVel

Problemi correlati