Server存储过程中 SET ANSI

    技术2024-12-01  17

    在通过sql server2005/2008创建存储过程的文件时,在文件的开头部分会默认出现下面这几行代码:

    USE [Test] GO SET ANSI_NULLS ON GO SET QUOTED_IDENTIFIER ON GO

    作用和详解:

    USE:指明整个存储过程所调用/使用的数据库,其中Test是我本地建立的数据库名称,USE [Test]就是告诉程序,要调用/使用的是我本地的Test数据库的意思。必须要指明调用/使用的具体数据库。

    GO:该语句不是SQL的语句,表示一个事务结束的标识,告诉程序在go语句之前的所有语句已经确认并提交了,可以进行批处理操作了。当程序运行到go语句时,就会直接对go语句之前的代码进行批处理操作了。

    SET ANSI_NULLS ON:表示对空值(null)对等于(=)或不等于(<>)进行判断时,遵从 SQL-92 规则。

    SQL-92规则中,在对空值(null)进行等于(=)或不等于(<>)比较时,取值为false。也就是说:

    ①即使是表中字段column_name中包含空值(null),在进行条件判断 where column_name = NULL 时,该select查询语句返回的数据是空的/返回零行。

    ②即使是表中字段column_name中包含非空值,在进行条件判断 where column_name <> NULL时,该select查询语句返回的数据是空的/返回零行。

    也就是说,当设置SET ANSI_NULLS ON时

    select * from a where name = null

    select * from a where name <> null

    得到的结果都是空的

    SET ANSI_NULLS OFF:表示在对空值(null)进行等于(=)或不等于(<>)比较时,不再遵从SQL-92的规则。即,

    ①当column_name字段中包含了空值(null),在进行条件判断 where column_name = null 时,该select查询语句会返回表中column_name 字段值为空(null)的数据行。

    ②当column_name字段中包含了非空值,在进行条件判断 where column_name <> null 时,该select 查询语句会返回表中column_name 字段值不为空的数据行。

    也就是说,当设置SET ANSI_NULLS OFF时

    select * from a where name = null

    返回的结果是name为NULL的内容

    select * from a where name <> null

    返回的结果是name不为NULL的内容

    SET QUOTED_IDENTIFIER ON:表示使用引用标识符,标识符可以用双引号分隔,但是文字必须用单引号分隔。 即 select "name","age","sex","grade" from a where name = '张三'

    select name,age,sex,grade from a where name = '张三'

    两者返回的结果是一样的,此时name,age,sex,grade都是字段名,而非文本。

    说明:当设置为ON时,标识符(数据表字段 name)等字段可以用双引号分隔,也可以不用双引号分隔,但是文字部分必须用单引号来分隔,否则会报错。

    注意:当设置为ON时,标识符返回的是该字段的值,name,返回的是姓名为张三,age字符返回的是年龄为25,sex字符返回的是性别为男,grade字符返回的是分数为400

    SET QUOTED_IDENTIFIER OFF:表示标识符不能用双引号分隔,否则标识符会被当做字符串值来返回,不再是字符来返回。 而且,文字部分必须用单引号或双引号分隔。 即 select "name","age","sex","grade" from a where name = '张三'

    返回的结果是

    (无列名)(无列名)(无列名)(无列名)nameagesexgrade

    select name,age,sex,grade from a where name = '张三'

    返回的结果才是正确的。

    说明:当设置为OFF时,标识符是不能用双引号来分隔的,否则标识符就会被当做是字符串来返回,不再是字符来返回了。而且,文字部分是必须要引号来分隔,可以是单引号(’’),也可以是双引号("")。

    Processed: 0.028, SQL: 9