L Server存儲過程中 SET ANSI_NULLS ON 和 SET QUOTED_IDENTIFIER ON的作用解釋

在通過sql server2005/2008創建存儲過程的文件時,在文件的開頭部分會默認出現下面這幾行代碼:

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

作用和詳解:

  1. USE:指明整個存儲過程所調用/使用的數據庫,其中Test是我本地建立的數據庫名稱,USE [Test]就是告訴程序,要調用/使用的是我本地的Test數據庫的意思。必須要指明調用/使用的具體數據庫。

  2. GO:該語句不是SQL的語句,表示一個事務結束的標識,告訴程序在go語句之前的所有語句已經確認並提交了,可以進行批處理操作了。當程序運行到go語句時,就會直接對go語句之前的代碼進行批處理操作了。

  3. 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

得到的結果都是空的

  1. 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的內容

  1. 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

  1. SET QUOTED_IDENTIFIER OFF:表示標識符不能用雙引號分隔,否則標識符會被當做字符串值來返回,不再是字符來返回。
    而且,文字部分必須用單引號或雙引號分隔。
select "name","age","sex","grade" from a where name = '張三'

返回的結果是

(無列名) (無列名) (無列名) (無列名)
name age sex grade

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

返回的結果纔是正確的。

說明:當設置爲OFF時,標識符是不能用雙引號來分隔的,否則標識符就會被當做是字符串來返回,不再是字符來返回了。而且,文字部分是必須要引號來分隔,可以是單引號(’’),也可以是雙引號("")。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章