這個(gè)資料是我上大學(xué)時(shí)候一直看到現(xiàn)在的, 既可以作為學(xué)習(xí)資料, 更可以作為開(kāi)發(fā)時(shí)候的速查手冊(cè). 具體來(lái)說(shuō)就是安裝了 SQL Server 2000 后里面自帶的幫助文檔的一部分.
可以下載這個(gè)壓縮包(限Windows平臺(tái)): http://beansoft.java-cn.org/download/tsqlref.zip 2.1MB CHM 格式, 有索引, 可搜索
那么這個(gè)資料的好處是什么呢?
1) 全中文
2) 語(yǔ)法特別詳細(xì)(當(dāng)然部分是 MS 特有的, 不太好).. 這里可以帶個(gè)例子給大家看:
Transact-SQL 參考
INSERT
將新行添加到表或視圖。
語(yǔ)法
INSERT [ INTO]
{ table_name WITH ( < table_hint_limited > [ ...n ] )
| view_name
| rowset_function_limited
}
[ ( column_list ) ]
{
{ VALUES(
{ DEFAULT | NULL | expression
} [ ,...n] )
| derived_table
| execute_statement
}
| DEFAULT VALUES
}
< table_hint_limited > ::=
{ FASTFIRSTROW
| HOLDLOCK
| PAGLOCK
| READCOMMITTED
| REPEATABLEREAD
| ROWLOCK
| SERIALIZABLE
| TABLOCK
| TABLOCKX
| UPDLOCK
}
參數(shù)
[INTO]
一個(gè)可選的關(guān)鍵字,可以將它用在 INSERT 和目標(biāo)表之間。
table_name
將要接收數(shù)據(jù)的表或 table 變量的名稱。
WITH (<table_hint_limited> [...n])
指定目標(biāo)表所允許的一個(gè)或多個(gè)表提示。需要有 WITH 關(guān)鍵字和圓括號(hào)。不允許有 READPAST、NOLOCK 和 READUNCOMMITTED。有關(guān)表提示的更多信息,請(qǐng)參見(jiàn) FROM。
view_name
視圖的名稱及可選的別名。通過(guò) view_name 來(lái)引用的視圖必須是可更新的。由 INSERT 語(yǔ)句所做的修改不能影響視圖的 FROM 子句中引用的多個(gè)基表。例如,在多表視圖中的 INSERT 必須使用 column_list,column_list 是只引用來(lái)自一個(gè)基表的列。有關(guān)可更新視圖的更多信息,請(qǐng)參見(jiàn) CREATE VIEW。
rowset_function_limited
是 OPENQUERY 或 OPENROWSET 函數(shù)。有關(guān)更多信息,請(qǐng)參見(jiàn) OPENQUERY 以及 OPENROWSET。
(column_list)
要在其中插入數(shù)據(jù)的一列或多列的列表。必須用圓括號(hào)將 column_list 括起來(lái),并且用逗號(hào)進(jìn)行分隔。
如果某列不在 column_list 中,則 Microsoft® SQL Server™ 必須能夠基于該列的定義提供一個(gè)值;否則不能裝載行。如果列滿足下面的條件,那么 SQL Server 將自動(dòng)為列提供值:
- 具有 IDENTITY 屬性。使用下一個(gè)增量標(biāo)識(shí)值。
- 有默認(rèn)值。使用列的默認(rèn)值。
- 具有 timestamp 數(shù)據(jù)類型。使用當(dāng)前的時(shí)間戳值。
- 是可空的。使用空值。
當(dāng)向標(biāo)識(shí)列中插入顯式的值時(shí),必須使用 column_list 及 VALUES 列表,并且對(duì)于表,SET IDENTITY_INSERT 選項(xiàng)必須是 ON。
VALUES
引入要插入的數(shù)據(jù)值的列表。對(duì)于 column_list(如果已指定)中或者表中的每個(gè)列,都必須有一個(gè)數(shù)據(jù)值。必須用圓括號(hào)將值列表括起來(lái)。
如果 VALUES 列表中的值與表中列的順序不相同,或者未包含表中所有列的值,那么必須使用 column_list 明確地指定存儲(chǔ)每個(gè)傳入值的列。
DEFAULT
強(qiáng)制 SQL Server 裝載為列定義的默認(rèn)值。如果對(duì)于某列并不存在默認(rèn)值,并且該列允許 NULL,那么就插入 NULL。對(duì)于使用 timestamp 數(shù)據(jù)類型定義的列,插入下一個(gè)時(shí)間戳值。DEFAULT 對(duì)標(biāo)識(shí)列無(wú)效。
expression
一個(gè)常量、變量或表達(dá)式。表達(dá)式不能包含 SELECT 或 EXECUTE 語(yǔ)句。
derived_table
任何有效的 SELECT 語(yǔ)句,它返回將裝載到表中的數(shù)據(jù)行。
execute_statement
任何有效的 EXECUTE 語(yǔ)句,它使用 SELECT 或 READTEXT 語(yǔ)句返回?cái)?shù)據(jù)。
如果將 execute_statement 與 INSERT 一起使用,那么每個(gè)結(jié)果集都必須與表中或 column_list 中的列兼容。execute_statement 可以用來(lái)執(zhí)行同一服務(wù)器或遠(yuǎn)程服務(wù)器上的存儲(chǔ)過(guò)程。執(zhí)行遠(yuǎn)程服務(wù)器中的過(guò)程,然后將結(jié)果集返回到本地服務(wù)器,并裝載到本地服務(wù)器的表中。如果 execute_statement 使用 READTEXT 語(yǔ)句返回?cái)?shù)據(jù),那么每個(gè)單獨(dú)的 READTEXT 語(yǔ)句最多可以返回 1 MB (1024 KB) 的數(shù)據(jù),也可以將 execute_statement 與擴(kuò)展過(guò)程一起使用,并且插入擴(kuò)展過(guò)程的主線程返回的數(shù)據(jù)。不會(huì)插入不是主線程的其它線程中的輸出結(jié)果。
說(shuō)明 對(duì)于 SQL Server 7.0,execute_statement 不包含返回 text 或 image 列的擴(kuò)展存儲(chǔ)過(guò)程。這個(gè)行為是從 SQL Server 早期版本變化而來(lái)的。
DEFAULT VALUES
強(qiáng)制新行包含為每個(gè)列所定義的默認(rèn)值。
注釋
INSERT 將新行追加到表中。若要替換表中的數(shù)據(jù),必須在使用 INSERT 裝載新數(shù)據(jù)之前,使用 DELETE 或 TRUNCATE TABLE 語(yǔ)句清除現(xiàn)有的數(shù)據(jù)。若要修改現(xiàn)有行中的列值,請(qǐng)使用 UPDATE。若要?jiǎng)?chuàng)建新表,并且通過(guò)一個(gè)步驟給它裝載數(shù)據(jù),請(qǐng)使用 SELECT 語(yǔ)句的 INTO 選項(xiàng)。
table 變量在其作用域內(nèi)可以像常規(guī)表一樣訪問(wèn)。因此,可以像在 INSERT 語(yǔ)句中將行添加到表一樣使用 table 變量。有關(guān)更多信息,請(qǐng)參見(jiàn) table。
由 OPENDATASOURCE 函數(shù)建立的、作為服務(wù)器名部分的四段名稱可以作為表源,該表源可以出現(xiàn)在 INSERT 語(yǔ)句中顯示表名的所有位置。
使用 uniqueidentifier 數(shù)據(jù)類型創(chuàng)建的列存儲(chǔ)特殊格式的 16 字節(jié)二進(jìn)制值。與標(biāo)識(shí)列不同,SQL Server 不會(huì)為帶有 uniqueidentifier 數(shù)據(jù)類型的列自動(dòng)地生成值。在插入操作過(guò)程中,帶有 uniqueidentifier 數(shù)據(jù)類型的變量以及某些字符串常量可以用于 uniqueidentifier 列(這些字符串常量的形式為:xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx,有 36 個(gè)字符,其中包括連字符。x 是十六進(jìn)制數(shù),范圍為 0-9 或 a-f。)。例如,對(duì)于 uniqueidentifier 變量或列,6F9619FF-8B86-D011-B42D-00C04FC964FF 是一個(gè)有效值。使用 NEWID() 函數(shù)可以獲取全局唯一的 ID (GUID)。
插入行時(shí),可以應(yīng)用下列規(guī)則:
- 如果將值裝載到帶有 char、varchar 或 varbinary 數(shù)據(jù)類型的列,尾隨空格(對(duì)于 char 和 varchar 是空格,對(duì)于 varbinary 是零)的填充和截?cái)嗍怯?SET ANSI_PADDING 設(shè)置確定的。該設(shè)置是在創(chuàng)建表時(shí)為列定義的。有關(guān)更多信息,請(qǐng)參見(jiàn) SET ANSI_PADDING。
下表顯示 SET ANSI_PADDING 為 OFF 時(shí)的默認(rèn)操作。
數(shù)據(jù)類型
默認(rèn)操作Char
將帶有空格的值填充到已定義的列寬。Varchar
刪除最后的非空格字符后面的尾隨空格,而對(duì)于只由空格組成的字符串,一直刪除到只留下一個(gè)空格字符。Varbinary
刪除尾隨的零。 - 如果將一個(gè)空字符串 (' ') 裝載到帶有 varchar 或 text 數(shù)據(jù)類型的列,那么默認(rèn)操作是裝載一個(gè)零長(zhǎng)度的字符串。如果數(shù)據(jù)庫(kù)的兼容級(jí)別小于 70,那么將該值轉(zhuǎn)換成單個(gè)空格。有關(guān)更多信息,請(qǐng)參見(jiàn) sp_dbcmptlevel。
- 如果 INSERT 語(yǔ)句違反約束或規(guī)則,或者它有與列的數(shù)據(jù)類型不兼容的值,那么該語(yǔ)句就會(huì)失敗,并且 SQL Server 顯示錯(cuò)誤信息。
- 將空值插入到 text 或 image 列不能創(chuàng)建有效的文本指針,也不能預(yù)分配 8 KB 的文本頁(yè)。有關(guān)插入 text 和 image 數(shù)據(jù)的更多信息,請(qǐng)參見(jiàn)使用 text、ntext 和 image 函數(shù)。
- 如果 INSERT 正在使用 SELECT 或 EXECUTE 裝載多行,正在裝載的值中出現(xiàn)任何違反規(guī)則或約束的行為都會(huì)導(dǎo)致整個(gè)語(yǔ)句終止,從而不會(huì)裝載任何行。
- 當(dāng)向遠(yuǎn)程 SQL Server 表中插入值且沒(méi)有為所有列指定值時(shí),則用戶必須標(biāo)識(shí)將向其中插入指定值的列。
在本地和遠(yuǎn)程分區(qū)視圖上,忽略 INSERT 語(yǔ)句的 SET ROWCOUNT 選項(xiàng)的設(shè)置。而且,當(dāng)兼容級(jí)別設(shè)置為 80 時(shí),在 SQL Server 2000 中的遠(yuǎn)程表上也不支持 INSERT 語(yǔ)句的 SET ROWCOUNT 選項(xiàng)。
當(dāng)為表或視圖的 INSERT 操作定義了 INSTEAD-OF 觸發(fā)器時(shí),該觸發(fā)器就會(huì)執(zhí)行 INSERT 語(yǔ)句中的 instead of。以前的 SQL Server 版本只支持在 INSERT 中定義的 AFTER 觸發(fā)器,以及其它數(shù)據(jù)修改語(yǔ)句。
如果在表達(dá)式賦值過(guò)程中 INSERT 語(yǔ)句遇到算術(shù)錯(cuò)誤(溢出、被零除或域錯(cuò)誤),那么 SQL Server 會(huì)處理這些錯(cuò)誤,就好像 SET ARITHABORT 是 ON 一樣。批處理的其余部分將終止,并且會(huì)返回一條錯(cuò)誤信息。
權(quán)限
默認(rèn)情況下,INSERT 權(quán)限被授予 sysadmin 固定服務(wù)器角色成員,db_owner 和 db_datawriter 固定數(shù)據(jù)庫(kù)角色成員,以及表的所有者。sysadmin、db_owner 和 db_securityadmin 角色成員和表所有者可以將權(quán)限轉(zhuǎn)讓給其他用戶。
示例
A. 使用簡(jiǎn)單的 INSERT
下面的示例創(chuàng)建表 T1,并且插入一行。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 VALUES (1, 'Row #1')
B. 插入與列順序不同的數(shù)據(jù)
下面的示例使用 column_list 及 VALUES 列表顯式地指定將被插入每個(gè)列的值。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
INSERT T1 (column_2, column_1) VALUES ('Row #1',1)
C. 插入值少于列個(gè)數(shù)的數(shù)據(jù)
下面的示例創(chuàng)建一個(gè)帶有四個(gè)列的表。INSERT 語(yǔ)句插入一些行,這些行只有部分列包含值。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1
( column_1 int identity,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('column default'),
column_3 int NULL,
column_4 varchar(40)
)
INSERT INTO T1 (column_4)
VALUES ('Explicit value')
INSERT INTO T1 (column_2,column_4)
VALUES ('Explicit value', 'Explicit value')
INSERT INTO T1 (column_2,column_3,column_4)
VALUES ('Explicit value',-44,'Explicit value')
SELECT *
FROM T1
D. 將數(shù)據(jù)裝載到帶有標(biāo)識(shí)列的表
前兩個(gè) INSERT 語(yǔ)句允許為新行生成標(biāo)識(shí)值。第三個(gè) INSERT 語(yǔ)句用 SET IDENTITY_INSERT 語(yǔ)句替代列的 IDENTITY 屬性,并且將一個(gè)顯式的值插入到標(biāo)識(shí)列。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE TABLE T1 ( column_1 int IDENTITY, column_2 varchar(30))
INSERT T1 VALUES ('Row #1')
INSERT T1 (column_2) VALUES ('Row #2')
SET IDENTITY_INSERT T1 ON
INSERT INTO T1 (column_1,column_2)
VALUES (-99,'Explicit identity value')
SELECT *
FROM T1
E. 通過(guò)視圖將數(shù)據(jù)裝載到表
在下面的示例中,INSERT 語(yǔ)句指定一個(gè)視圖名;但是將新行插入該視圖的基礎(chǔ)表中。INSERT 語(yǔ)句中 VALUES 列表的順序必須與視圖的列順序相匹配。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.VIEWS
WHERE TABLE_NAME = 'V1')
DROP VIEW V1
GO
CREATE TABLE T1 ( column_1 int, column_2 varchar(30))
GO
CREATE VIEW V1 AS SELECT column_2, column_1
FROM T1
GO
INSERT INTO V1
VALUES ('Row 1',1)
SELECT *
FROM T1
F. 使用 DEFAULT VALUES 選項(xiàng)裝載數(shù)據(jù)
在下面的示例中,CREATE TABLE 語(yǔ)句給每個(gè)列定義一個(gè)值,當(dāng)在 INSERT 語(yǔ)句中沒(méi)有為列指定顯式的值時(shí),就可以使用這個(gè)值。使用 INSERT 語(yǔ)句的 DEFAULT VALUES 選項(xiàng),無(wú)須提供顯式的值就可以添加行。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'T1')
DROP TABLE T1
GO
CREATE DEFAULT bound_default AS 'Bound default value'
GO
CREATE TABLE T1
( column_1 int identity,
column_2 varchar(30)
CONSTRAINT default_name DEFAULT ('column default'),
column_3 timestamp,
column_4 varchar(30),
column_5 int NULL)
GO
USE master
EXEC sp_bindefault 'bound_default','T1.column_4'
INSERT INTO T1 DEFAULT VALUES
SELECT *
FROM T1
G. 使用 SELECT 和 EXECUTE 選項(xiàng)裝載數(shù)據(jù)
下面的示例演示三種不同的方法,用來(lái)從一個(gè)表獲取數(shù)據(jù),并將數(shù)據(jù)裝載到另一個(gè)表。每種方法都基于一個(gè)多表 SELECT 語(yǔ)句,該語(yǔ)句在列列表中包含一個(gè)表達(dá)式及一個(gè)文字值。
第一個(gè) INSERT 語(yǔ)句使用一個(gè) SELECT 語(yǔ)句直接從源表 (authors) 檢索數(shù)據(jù),并且將結(jié)果集存儲(chǔ)到 author_sales 表。第二個(gè) INSERT 執(zhí)行一個(gè)包含 SELECT 語(yǔ)句的過(guò)程,而第三個(gè) INSERT 將 SELECT 語(yǔ)句作為一個(gè)文字字符串執(zhí)行。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = 'author_sales') DROP TABLE author_sales GO IF EXISTS(SELECT name FROM sysobjects WHERE name = 'get_author_sales' AND type = 'P') DROP PROCEDURE get_author_sales GO USE pubs CREATE TABLE author_sales ( data_source varchar(20), au_id varchar(11), au_lname varchar(40), sales_dollars smallmoney ) GO CREATE PROCEDURE get_author_sales AS SELECT 'PROCEDURE', authors.au_id, authors.au_lname, SUM(titles.price * sales.qty) FROM authors INNER JOIN titleauthor ON authors.au_id = titleauthor.au_id INNER JOIN titles ON titleauthor.title_id = titles.title_id INNER JOIN sales ON titles.title_id = sales.title_id WHERE authors.au_id like '8%'
GROUP BY authors.au_id, authors.au_lname
GO
--INSERT...SELECT example
USE pubs
INSERT author_sales
SELECT 'SELECT', authors.au_id, authors.au_lname,
SUM(titles.price * sales.qty)
FROM authors INNER JOIN titleauthor
ON authors.au_id = titleauthor.au_id INNER JOIN titles
ON titleauthor.title_id = titles.title_id INNER JOIN sales
ON titles.title_id = sales.title_id
WHERE authors.au_id LIKE '8%'
GROUP BY authors.au_id, authors.au_lname
--INSERT...EXECUTE procedure example
INSERT author_sales EXECUTE get_author_sales
--INSERT...EXECUTE('string') example
INSERT author_sales
EXECUTE
('
SELECT ''EXEC STRING'', authors.au_id, authors.au_lname,
SUM(titles.price * sales.qty)
FROM authors INNER JOIN titleauthor
ON authors.au_id = titleauthor.au_id INNER JOIN titles
ON titleauthor.title_id = titles.title_id INNER JOIN sales
ON titles.title_id = sales.title_id
WHERE authors.au_id like ''8%''
GROUP BY authors.au_id, authors.au_lname
')
--Show results.
SELECT * FROM author_sales
H. 使用 SELECT 語(yǔ)句中的 TOP 子句插入數(shù)據(jù)
因?yàn)榭梢栽?INSERT 語(yǔ)句中指定 SELECT 語(yǔ)句,所以也可以將 TOP 子句用在 SELECT 語(yǔ)句中。下面的示例將 authors 表中最上面的 10 個(gè)作者插入到名為 new_authors 的新表中。
IF EXISTS(SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'new_authors')
DROP TABLE new_authors
GO
USE pubs
CREATE TABLE new_authors
(
au_id id,
au_lname varchar(40),
au_fname varchar(20),
phone char(12),
address varchar(40),
city varchar(20),
state char(2),
zip char(5),
contract bit
)
INSERT INTO new_authors
SELECT TOP 10 *
FROM authors