SET OPTIONS

Oopps! Upgrade your browser pretty please. Oopps! Upgrade your browser pretty please.

Efter att ha svävat omkring i molnet hela veckan tänkte jag att det nu är dags att komma ner på jorden igen 🙂 Härom dagen behövde jag snygga till lite data. Eftersom datat laddas om varje vecka så var det ju ett måste att automatisera det hela. Jag bestämde mig för att skapa ett jobb som körs av SQL Server Agent. Själva tillsnyggandet av datat var mycket enkel: UPDATE TraceEvent SET StartTime = DATEADD(DD, DATEDIFF(DD, StartTime, EndTime), StartTime) Alltså inga konstigheter. När jag sedan provkör detta så får jag ett fel: Executed as user: NT AUTHORITYSYSTEM. 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. [SQLSTATE 42000] (Error 1934).  The step failed.

Ok, vad är nu detta? Det fungerade bra när jag testkörde i SSMS, jag har ingen indexerad vy, jag har inga xml datatyper och absolut inga spatiala index….

MEN min tabell innehåller faktiskt en “computed column”! Vad SQL Server säger är att jag har fel SET Options men när jag kör Update skriptet direkt i Management Studio så går det bra, det måste betyda att jag får andra SET Options när jag kör det hela i ett jobb.

Ett enkelt sätt att ta reda på vilka SET Options man har när man kör ett jobb är att lägga in följande i ett jobbsteg: DECLARE @options INT SELECT @options = @@OPTIONS IF ( (1 & @options) = 1 ) PRINT ‘DISABLE_DEF_CNST_CHK’ IF ( (2 & @options) = 2 ) PRINT ‘IMPLICIT_TRANSACTIONS’ IF ( (4 & @options) = 4 ) PRINT ‘CURSOR_CLOSE_ON_COMMIT’ IF ( (8 & @options) = 8 ) PRINT ‘ANSI_WARNINGS’ IF ( (16 & @options) = 16 ) PRINT ‘ANSI_PADDING’ IF ( (32 & @options) = 32 ) PRINT ‘ANSI_NULLS’ IF ( (64 & @options) = 64 ) PRINT ‘ARITHABORT’ IF ( (128 & @options) = 128 ) PRINT ‘ARITHIGNORE’ IF ( (256 & @options) = 256 ) PRINT ‘QUOTED_IDENTIFIER’ IF ( (512 & @options) = 512 ) PRINT ‘NOCOUNT’ IF ( (1024 & @options) = 1024 ) PRINT ‘ANSI_NULL_DFLT_ON’ IF ( (2048 & @options) = 2048 ) PRINT ‘ANSI_NULL_DFLT_OFF’ IF ( (4096 & @options) = 4096 ) PRINT ‘CONCAT_NULL_YIELDS_NULL’ IF ( (8192 & @options) = 8192 ) PRINT ‘NUMERIC_ROUNDABORT’ IF ( (16384 & @options) = 16384 ) PRINT ‘XACT_ABORT’ Printsatserna kommer då att skriva ut de SET Options som gäller och dessa kan man se i “View History” på jobbet. I mitt fall blev resultatet: Executed as user: NT AUTHORITYSYSTEM. ANSI_WARNINGS [SQLSTATE 01000] (Message 0)  ANSI_PADDING [SQLSTATE 01000] (Message 0)  ANSI_NULLS [SQLSTATE 01000] (Message 0)  ANSI_NULL_DFLT_ON [SQLSTATE 01000] (Message 0)  CONCAT_NULL_YIELDS_NULL [SQLSTATE 01000] (Message 0). 

The step succeeded. Här kan man då se att QUOTED_IDENTIFIER inte är satt vilket är mitt problem. Allt som behöver göras nu är att ändra jobbet till: SET QUOTED_IDENTIFIER ON GO UPDATE TraceEvent SET StartTime = DATEADD(DD, DATEDIFF(DD, StartTime, EndTime), StartTime)

Nu funkar jobbet som tänkt och allt är återigen frid och fröjd 🙂