在通過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 = '張三'
返回的結果是
(無列名) | (無列名) | (無列名) | (無列名) |
---|---|---|---|
name | age | sex | grade |
而
select name,age,sex,grade from a where name = '張三'
返回的結果纔是正確的。
說明:當設置爲OFF時,標識符是不能用雙引號來分隔的,否則標識符就會被當做是字符串來返回,不再是字符來返回了。而且,文字部分是必須要引號來分隔,可以是單引號(’’),也可以是雙引號("")。