SQLCMD en QUOTED_IDENTIFIER

Gepubliceerd op 29/5/2013

Vorige week hadden we een probleem met een implementatie. Tijdens het draaien van de SQL scripts kregen we een foutmelding:

 

Msg 1934, Level 16, State 1, Line 4

 

UPDATE failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER'. Verify that SET options are correct for use with indexed views and/or indexes on computed columns and/or filtered indexes and/or query notifications and/or XML data type methods and/or spatial index operations.

Tijdens deze implementatie deden we één UPDATE van een kolom waar een 'computed column' bij hoort. Dat moest dus wel de oorzaak zijn, maar als we het UPDATE statement uitvoerden via SQL Management Studio dan werkte het prima! Dus wij op onderzoek uit...

Tijdens een sessie kun je op meerdere manier de instelling voor 'quoted identifiers' bekijken. Je kunt het commando:

SELECT SESSIONPROPERTY('quoted_identifier')

gebruiken. Deze geeft een 0 als QUOTED_IDENTIFIER OFF is en een 1 als QUOTED_IDENTIFIER ON is.

 

Of je gebruikt

DBCC USEROPTIONS

Deze geeft een lijst van de momenteel in gebruik zijnde SET opties:

Als QUOTED_IDENTIFIER ON is zie je de waarde SET staan zoals in het plaatje hierboven. Als de QUOTED_IDENTIFIER OFF is, ontbreekt de waarde in het lijstje.

 

In Microsoft SQL Server Management Studio kun je de default gebruikte optie wijzigen. Kies het menu-item [Tools\Options...] en ga dan naar Query Executions\SQL Server\ANSI.

 

Omdat deze setting standaard aan staat was het logisch dat ons SQL script werkte via Management Studio. Tijdens een implementatie gebruiken wij echter een batch file die 'loopt' door alle SQL scripts in een directory en deze uitvoert m.b.v SQLCMD. En daar zat het probleem, want SQLCMD gebruikt standaard de setting QUOTED_IDENTIFIER OFF. Om dit default gedrag te veranderen moet je de parameter "-I" mee geven

sqlcmd -I

Dan wordt in de sessie

SET QUOTED_IDENTIFIER ON

gebruikt. Natuurlijk kun je er ook voor kiezen dit commando in elk script dat uitgevoerd moet worden op te nemen.

 

Waarom Microsoft er voor gekozen heeft bijna overal in alle tools als default QUOTED_IDENTIFIER ON gebruikt, behalve in SQLCMD is mij een raadsel. Maar vanaf nu zal ik er rekening mee houden!

 

Terug naar Artikelen

Stuur een e-mail