SQL SERVER – QUOTED_IDENTIFIER ON/OFF and ANSI_NULL ON/OFF Explanation

When create or alter SQL object like Stored Procedure, User Defined Function in Query Analyzer, it is created with following SQL commands prefixed and suffixed. What are these – QUOTED_IDENTIFIER ON/OFF and ANSI_NULL ON/OFF?
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS ON
GO--SQL PROCEDURE, SQL FUNCTIONS, SQL OBJECTGO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

ANSI NULL ON/OFF:
This option specifies the setting for ANSI NULL comparisons. When this is on, any query that compares a value with a null returns a 0. When off, any query that compares a value with a null returns a null value.

QUOTED IDENTIFIER ON/OFF:
This options specifies the setting for usage of double quotation. When this is on, double quotation mark is used as part of the SQL Server identifier (object name). This can be useful in situations in which identifiers are also SQL Server reserved words.

Reference : Pinal Dave (https://blog.sqlauthority.com)

SQL Scripts
Previous Post
SQL SERVER – Delete Duplicate Records – Rows
Next Post
SQL SERVER – Script to Determine Which Version of SQL Server 2000-2005 is Running

Related Posts

36 Comments. Leave new

  • Can u please provide any example of both of these, So that more clearly we can understand these.

    Reply
    • SET QUOTED_IDENTIFIER OFF
      GO
      — An attempt to create a table with a reserved keyword as a name
      — should fail.
      CREATE TABLE “select” (“identity” INT IDENTITY NOT NULL, “order” INT NOT NULL);
      GO

      SET QUOTED_IDENTIFIER ON;
      GO

      — Will succeed.
      CREATE TABLE “select” (“identity” INT IDENTITY NOT NULL, “order” INT NOT NULL);
      GO

      SELECT “identity”,”order”
      FROM “select”
      ORDER BY “order”;
      GO

      DROP TABLE “SELECT”;
      GO

      SET QUOTED_IDENTIFIER OFF;
      GO

      Reply
      • vijay mane(kolhapur)
        September 16, 2013 5:37 pm

        set ansi_nulls on
        go
        SELECT *

        FROM [demo].[dbo].[product] where product_name =null
        go
        set ansi_nulls off
        go
        SELECT *

        FROM [demo].[dbo].[product] where product_name =null

  • Got it… I have Created a table with fields Id and Name then i inserted many values in that table and also inserted a NULL value. in the Name field
    Then When i am rnning below querry it not returns any record to me.
    SET ANSI_NULLS ON
    SELECT Name FROM MyTable(Nolock) WHERE Name=NULL

    AND
    When iam running below querry it returns the row with NULL value
    SET ANSI_NULLS OFF
    SELECT Name FROM MyTable(Nolock) WHERE Name=NULL

    So, If in case of null when ANSI_NULLS is on Wht are the benefits of this i think this is wrong caz it does not return any row which having null. Why this is present in SQL any Specific reasons, Where we use this.????

    Reply
  • I’m a SQL beginner, and this stuff drives me crazy. However, we’ve using “is null” instead of “= null” and it seems to work regardless of the setting. Try this. This shows the difference between the two approaches:

    set ansi_nulls on

    declare @myTab table (id int null, [name] varchar(10) null)

    insert into @myTab (id,[name]) values (1, ‘sam’)
    insert into @myTab (id,[name]) values (2, ‘dave’)
    insert into @myTab (id,[name]) values (3, null)

    select * from @myTab
    select * from @myTab where [name] is null
    select * from @myTab where [name] = null

    Reply
  • Hi
    in a query set ansi_nulls on
    and select the null coulmn is gives null value
    if set ansi_nulls off also behave same.
    then how to know diff between the ansi_nulls on and off
    do mail to me.

    Thank you

    Reply
  • When SET ANSI_NULLS is ON, all comparisons against a null value evaluate to UNKNOWN. (FALSE)
    When SET ANSI_NULLS is OFF, comparisons of all data against a null value evaluate to TRUE if the data value is NULL
    When SET ANSI_NULLS is ON,

    a SELECT statement using WHERE Emp_Name= NULL returns zero rows even if there are null values in Emp_Name.

    A SELECT statement using WHERE Emp_Name NULL returns zero rows even if there are nonnull values in Emp_Name.

    When SET ANSI_NULLS is OFF, the Equals (=) and Not Equal To () comparison operators do not follow the SQL-92 standard.

    A SELECT statement using WHERE Emp_Name= NULL returns the rows with null values Emp_Name.

    A SELECT statement using WHERE Emp_Name NULL returns the rows with nonnull values in the column.

    SET ANSI_NULLS also must be ON for executing distributed queries and when creating or manipulating indexes on computed columns or indexed views.

    If SET ANSI_NULLS is OFF, CREATE, UPDATE, INSERT, and DELETE statements on tables with indexes on computed columns or indexed views will fail. SQL Server will return an error listing all SET options violating the required values.

    When executing a SELECT statement, if SET ANSI_NULLS is OFF, SQL Server will ignore the index values on computed columns or views and resolve the select as though there were no such indexes on the tables or views.

    If you want a script to work regardless of the ANSI NULSS database option or the setting of SET ANSI_NULLS, use IS NULL and IS NOT NULL in comparisons that may contain null values.

    Reply
  • SQL SERVER – QUOTED_IDENTIFIER ON/OFF and ANSI_NULL ON/OFF Explanation:

    i am using SQL server 2005
    in affect to what is said about ANSI NULL ON and
    QUOTED IDENTIFIER ON,
    I do not get NULL if i place empty records in tables
    instead only an empty space appears

    please givme more details on these

    Reply
  • What are the advantages of SET QUOTED_IDENTIFIER ON,
    SET ANSI_NULLS ON.

    When we should make them on and Off.

    Thnx

    Pawan

    Reply
  • When I run queries using sql 2005 the file output is encoded UCS-2, when I run the same query on my old desktop using sql 2000 the files are ANSI. Same database, different desktop and different pcs. I have set my file output to the normal defaults on the sql 2005 pc. What am I missing?

    Reply
    • Ricardo Pereira
      October 28, 2010 2:55 pm

      Did you find a solution for your problem? I’m having the same problem with SQL 2008!

      Can you help me?

      Regards

      Reply
  • Hi Pinal,
    why do you know about null values dont work in SHAPE – APPEND – CALC.

    example;
    ———————-
    shape
    a_table…
    append a1_table bla bla… relation a to a1 …
    append a2_table bla bla… relation a to a2 …
    compute
    sum (a1_money) as a1m,
    sum (a2_money) as a2m,
    calc (a1m – a2m) as adiff
    —————————

    “adiff” is empty if “a2m” is null…

    ANSI_NULL is not work in these query.

    do you have any solution ?
    please help me immediately.

    thank you.

    Reply
  • Hi,

    To handle NULL value in calculation use ISNULL function. SET ANSI_NULLS affect the result of equal to (=) and not equal to () comparision with NULL value.

    Regards,
    Pinal Dave

    Reply
  • SET ASNI_NULL ON
    select * from table where col1 = NULL
    select * from table where col1 NULL
    both the cases result is 0 rows

    SET ASNI_NULL OFF
    select * from table where col1 = NULL
    select * from table where col1 NULL
    in one case definately you will get result

    Hope this explanation helps. I found this from a forum and tried. I worked fine. So why not you guys try.

    Reply
  • Santosh Gadila
    June 12, 2010 5:57 am

    hi HariPrasad,
    I have created a table
    the result set of SELECT * FROM table is as follows

    1 Steve
    2 NULL
    3 Mike
    4 NULL

    When I used
    SET ANSI_NULLS ON
    select * from table
    the result set is same as the above.
    — But when I used
    SET ANSI_NULLS ON
    select Name from table where Name = NULL
    It retrieves no result.
    I did not understand why? there is nothing difference between setting the ANSI_NULLS ON and ANSI_NULLS OFF
    in case of
    SET ANSI_NULLS ON
    select * from table

    and

    SET ANSI_NULLS ON
    select * from table

    Can u explain ?

    Reply
    • Hi Santosh,
      Sorry just saw your post. Setting ANSI_NULLS ON or OFF is used for selecting NULL values.

      Eg.. in your case the select * from table irrespective of the ANSI flag will result in
      1 Steve
      2 NULL
      3 Mike
      4 NULL

      Try these two scenarios.
      1. SET ANSI_NULLS ON
      select * from table where name = NULL
      2. SET ANSI_NULLS OFF
      select * from table where name = NULL

      Now I am sure you will find the difference.. Let me know how are you getting on this.

      Cheers
      Hari

      Reply
  • sahayapraveen
    July 27, 2010 10:32 am

    Thank you its very clear to understand

    Reply
  • thanks
    Hariprasad

    exact and accurate answer. thanks again .!!

    Reply
  • Good explanation

    Reply
  • HAI genius,

    How to remove duplicate records from a table?

    Reply
  • Does anybody know how to suppress the “SET ANSI_NULLS SET QUOTED_IDENTIFIER ON” lines when I modify a stored procedure in Management Studio? Thanks!

    Reply
  • SET @@ROW_COUNT =1
    THEN DELETE only one value will be deleted.
    After that again SET @@ROW_COUNT =0

    Reply
  • Sry wrong one from me

    correction ROWCOUNT not @@ROW_COUNT

    Reply
  • Hi

    I am trying to create a stored procedure for SQL Server 2008 R2. I want this stored procedure to have uses_ansi_nulls as False.
    My database’s ANSI NULLS Enabled property is set to False.
    I’m creating procedure as below:

    SET ANSI_NULLS ON
    GO
    CREATE PROCEDURE MY_SP

    Procedure is created successfully but following query returns true.

    SELECT uses_ansi_nulls, uses_quoted_identifier
    FROM sys.sql_modules
    WHERE object_id = object_id(‘MY_SP’)

    Is there a way to create stored procedure so that above query returns false (SET ANSI_NULLS remain false).

    Reply

Leave a Reply