These are the two widely used SET options in SQL Server.
Most developers explicitly set these options while creating Stored
Procedures, Triggers and User Defined Functions but many are unclear on
why we need to explicitly SET them? And why they are special compared to
other options?
Below is the typical usage of these options.
SET QUOTED_IDENTIFIER ON/OFF:
It specifies how SQL Server treats the data that is defined in Single Quotes and Double Quotes. When it is set to ON any character set that is defined in the double quotes “” is treated as a T-SQL Identifier (Table Name, Proc Name, Column Name….etc) and the T-SQL rules for naming identifiers will not be applicable to it. And any character set that is defined in the Single Quotes ‘’ is treated as a literal.
When it is set to OFF any character set that is defined either in Single Quotes or in Double Quotes is treated as a literal.
Why are these two options Special?:
These two SET options are special because whenever a stored procedure or a Trigger or a User Defined Function is created or modified with these options explicitly SET; SQL Server remembers those settings in the associated object metadata. And every time the object (stored procedure,Trigger..etc.) is executed SQL server uses the stored settings irrespective of what the current user session settings are. So the behavior of the stored procedure is not altered by the calling session settings and the usage of the SET option behavior inside the SP is always guaranteed.
You can get any procedure or trigger or function settings for these options from the sys..sql_modules metadata table.
Hope it helps.
-Adulyajed
Tags: SET ANSI_NULL OFF, SET ANSI_NULL ON, SET QUOTED_IDENTIFIER OFF, SET QUOTED_IDENTIFIER ON
Below is the typical usage of these options.
SET QUOTED_IDENTIFIER ON GO SET ANSI_NULLS ON GO CREATE PROCEDURE SampleProcedure AS BEGIN -- select employees SELECT * FROM HumanResources.Employee ENDLets first understand what they exactly mean to SQL Server and then we will move on to why they are special.
SET QUOTED_IDENTIFIER ON/OFF:
It specifies how SQL Server treats the data that is defined in Single Quotes and Double Quotes. When it is set to ON any character set that is defined in the double quotes “” is treated as a T-SQL Identifier (Table Name, Proc Name, Column Name….etc) and the T-SQL rules for naming identifiers will not be applicable to it. And any character set that is defined in the Single Quotes ‘’ is treated as a literal.
SET QUOTED_IDENTIFIER ON CREATE TABLE "SELECT" ("TABLE" int) -- SUCCESS GO SET QUOTED_IDENTIFIER ON SELECT "sometext" AS Value -- FAIL because “sometext” is not a literalThough the “SELECT” and “TABLE” are reserved keywords we are able to create the table because they are now treated as identifiers and the T SQL rules for identifier names are ignored.
When it is set to OFF any character set that is defined either in Single Quotes or in Double Quotes is treated as a literal.
SET QUOTED_IDENTIFIER OFF CREATE TABLE "SELECT"(“TABLE” int) -- FAIL GO SET QUOTED_IDENTIFIER OFF SELECT "sometext" AS Value -- SUCCESS as “sometext” is treated as a literalYou can clearly see the difference in CREATE TABLE and SELECT query. Here the CREATE TABLE fails because “SELECT” is a reserved keyword and it is considered as a literal. The default behavior is ON in any database.
SET ANSI_NULLS ON/OFF:
The ANSI_NULLS option specifies that how SQL Server handles the
comparison operations with NULL values. When it is set to ON any
comparison with NULL using = and <> will yield to false value. And
it is the ISO defined standard behavior. So to do the comparison with
NULL values we need to use IS NULL and IS NOT NULL. And when it is set
to OFF any comparison with NULL using = and <> will work as usual
i.e. NULL = NULL returns true and 1= NULL returns false.
SET ANSI_NULLS ON IF NULL = NULL PRINT 'same' ELSE PRINT 'different' --result: different SET ANSI_NULLS ON IF NULL IS NULL PRINT 'same' ELSE PRINT 'different' -- result: sameThe default behaviour is ON in any database. As per BOL 2008 this option will always be set to ON in the future releases of SQL Server and any explicit SET to OFF will result an error. So avoid explicitly setting this option in future development work.
Why are these two options Special?:
These two SET options are special because whenever a stored procedure or a Trigger or a User Defined Function is created or modified with these options explicitly SET; SQL Server remembers those settings in the associated object metadata. And every time the object (stored procedure,Trigger..etc.) is executed SQL server uses the stored settings irrespective of what the current user session settings are. So the behavior of the stored procedure is not altered by the calling session settings and the usage of the SET option behavior inside the SP is always guaranteed.
You can get any procedure or trigger or function settings for these options from the sys..sql_modules metadata table.
SELECT uses_ansi_nulls, uses_quoted_identifier FROM sys.sql_modules WHERE object_id = object_id('SampleProcedure')And if you need to guarantee the behavior for other SET options like SET ARITHABORT inside the SP then you need to SET them inside the procedure. The scope of the options specified inside the procedure are only applicable until the procedure completes its execution.
Hope it helps.
-Adulyajed
Tags: SET ANSI_NULL OFF, SET ANSI_NULL ON, SET QUOTED_IDENTIFIER OFF, SET QUOTED_IDENTIFIER ON
Tidak ada komentar:
Posting Komentar