SET ANSI_NULLS:  
当 SET ANSI_NULLS 为 ON 时,即使 column_name 中存在空值,使用 WHERE column_name = NULL 的 SELECT 语句仍返回零行。即使 column_name 中存在非空值,使用 WHERE column_name <> NULL 的 SELECT 语句仍返回零行。

当 SET ANSI_NULLS 为 OFF 时,等于 (=) 和不等于 (<>) 比较运算符不遵从 SQL-92 标准。使用 WHERE column_name = NULL 的 SELECT 语句返回 column_name 中含有空值的行。使用 WHERE column_name <> NULL 的 SELECT 语句返回列中含有非空值的行。此外,使用 WHERE column_name <> XYZ_value 的 SELECT 语句返回所有非 XYZ 值和非 NULL的行。

SET QUOTED_IDENTIFIER :
SQL SERVER的联机丛书的解释:
“当 SET QUOTED_IDENTIFIER 为 ON 时,标识符可以由双引号分隔,而文字必须由单引号分隔。当 SET QUOTED_IDENTIFIER 为 OFF 时,标识符不可加引号,且必须遵守所有 Transact-SQL 标识符规则。”

先说说什么是标识符,举个例子,如果创建了一个叫做USER的数据库表,则直接用SQL语句“SELECT * FROM USER”做查询时会报错:“在关键字 'USER' 附近有语法错误。”,也就是USER被视作SQL SERVER的关键字处理了,而不是被认为是一个表或视图。但如果修改为“SELECT * FROM [USER]”就没问题了。此处的方括号就是标识符。标识符的作用就是告诉数据库引擎,此处是一个数据库对象(比如是一个表、视图、存储过程等),而不是 一个关键字。

在SQL SERVER中,方括号是标识符,但不仅仅是方括号可以做标识符。在特定的情况下,双引号也可以做标识符,也就是前面的sql语句可以修改为 “SELECT * FROM "USER"”,而这个特定的情况也就是SET QUOTED_IDENTIFIER ON的情况下。当SET QUOTED_IDENTIFIER值为ON时,双引号内的字符被当作是数据库对象。而在其值为OFF时,双引号被解释为字符串的边界,和单引号的作用是 类似的。比如如下几组SQL 语句都是正确的(假设USER表有一个U_NAME的varchar型的字段)

SET QUOTED_IDENTIFIER ON
SELECT * FROM "USER" WHERE U_NAME='netasp'

SET QUOTED_IDENTIFIER ON
SELECT * FROM [USER] WHERE U_NAME='netasp'

SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME="netasp"

SET QUOTED_IDENTIFIER OFF
SELECT * FROM [USER] WHERE U_NAME='netasp'

现在剩下最后一个小问题了,SQL SERVER联机丛书说OFF是SET QUOTED_IDENTIFIER的默认值,那如果我们省略掉SET QUOTED_IDENTIFIER语句和写了SET QUOTED_IDENTIFIER OFF应该效果一致才对,但事实证明省略掉SET QUOTED_IDENTIFIER语句和SET QUOTED_IDENTIFIER ON语句才是一致的,这又是为什么呢?原来在默认情况下,连接到 SQL Server 时,ODBC 和 OLE DB 客户端发出连接级 SET 语句,将 QUOTED_IDENTIFIER 设置为 ON。而连接级设置(使用 SET 语句设置)会替代 QUOTED_IDENTIFIER 的默认数据库设置。原来如此!!!

转载于:https://blog.51cto.com/flandycheng/280179

SQL存储过程中QUOTED_IDENTIFIER和ANSI_NULLS相关推荐

  1. 在SQL存储过程中给条件变量加上单引号

    在SQL存储过程中给条件变量加上单引号,不加语句就会出问题,以下就是在存储过程中将条件where设置成了动态变化的,给where赋完值再和前面的语句拼接,再execute(SQL) set @wher ...

  2. sql存储过程中分隔字符串

    最近遇到了如下问题,要向用户角色信息表中插入数据. 每个用户有多个角色,因此每次添加用户要添加一到多条记录. 这个过程要放到存储过程中实现,但是存储过程不能传入集合. 解决思路是,将角色Id集合转成用 ...

  3. 如何在sql存储过程中打log_教你如何记录Entity Framework框架自动生成的SQL语句

    有两种方法可以记录执行的SQl语句: · 使用DbContext.Database.Log属性 · 实现IDbCommandInterceptor接口 1使用DbContext.Database.Lo ...

  4. 如何在sql存储过程中打log_SQL语句优化

    如何定位并优化慢查询 SQL?大致思路如下: 根据慢查询日志定位慢查询 SQL: 使用 explain 等工具分析 SQL: 修改 SQL 或者尽量让 SQL 走索引. 获取有性能问题的 SQL 的 ...

  5. oracle学习-PL SQL 存储过程中循环

    PL SPL 提供了3中不同类型的循环结构 -- 实例:索引 loop_counter从1开始,到10 结束,循环共执行10次 FOR loop_counter IN 1 .. 10 LOOP...可 ...

  6. SQL存储过程中调用存储过程返回的表

    存储过程pro_A返回一个表集合TableA,在存储过程pro_B中以TableA为数据源再做一重过滤,想实现代码复用,因此原意是在存储过程pro_B中调用存储过程pro_A,但事实发现我们不能写成s ...

  7. sql 存储过程中top 后面跟参数的问题

    之前存储过程中有top的情况,都是拼接sql,然后通过exec执行,进行查询结果,很不方便. 今天研究了,原来top后面是可以直接写参数的. 只需要top 后面的参数加上小括号就好了 eg: TOP ...

  8. SQL 存储过程中,将串连的字符串当表用。

    select distinct order_no,IDENTITY(int,1,1) as px into #g from gold_purify_detail where order_no in ( ...

  9. 在存储过程中的clob数据类型

    客户新上线的一套重要生产系统,某个存储过程每小时调用约11万次,每次调用的逻辑读超过了10000,消耗的CPU占数据库CPU Time的25-30%.很显然,这样一个存储过程是值得优化的. 不幸的是, ...

最新文章

  1. 算法学习--买卖股票的最佳时机
  2. java类的讲解_【java 基础】java类的权限讲解
  3. 如何禁止网络爬虫频繁爬自己网站
  4. 菜鸟学java要多久_菜鸟学java,根本停不下来!
  5. 数据库的恢复 mysql
  6. KD_Tree 算法
  7. 大数据“高烧不断”,“得数据者得天下”的关键在哪?
  8. RTT内核对象——对象理解
  9. appium装上开始干嘛
  10. 网页显示mysql数据库到表格数据_在网页中如何将数据库的数据显示出来
  11. oracle processes 的大小,Oracle中sessions和processes的大小关系(10g和11g不同)
  12. 世界国家中英文名称以及地区区号json格式
  13. 8 种 NoSQL 数据库系统对比
  14. [Excel函数]--intercept函数
  15. Kettle spoon
  16. bootm bootz
  17. sql子表求和在总表中显示,并参与搜索
  18. 齿轮故障诊断数据集分享(包括轴承和齿轮)
  19. python int() round() floor()函数的比较
  20. IPtable之SNAT与DNAT

热门文章

  1. mybatis 多线程_2019BATJ面试题汇总详解:MyBatis+MySQL+Spring+Redis+多线程
  2. Python基本操作(二)注释、分隔
  3. 程序员求助:腾讯面试题,64匹马8个跑道,多少轮选出最快的四匹
  4. 精通HTML5+CSS3需要学什么?
  5. 现在加入Web前端学习还有市场吗?自己是否适合学习前端
  6. matlab 箱图不显示异常值_无功功率显示值与计算值不匹配?
  7. QT_UDP传输小结
  8. java小数换成字符实现加法_第一、二次笔记总结
  9. excel 时间戳_用Excel实战数据分析,WPS真的可以!
  10. 视频点播服务器实现视频转码和视频播出功能