常用数据库脚本

经常遇到有人问 T-SQL 的语法,故将之前学习 T-SQL 时的笔记整理发布出来,方便查阅。

创建数据库与删除数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/*
创建数据库
*/
CREATE DATABASE TempDB
ON PRIMARY
(
NAME='TempDB',
FILENAME='D:\TempDB.mdf',
SIZE=3MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=1MB
)
LOG ON
(
NAME='TempDB',
FILENAME='D:\TempDB.ldf',
SIZE=1MB,
MAXSIZE=UNLIMITED,
FILEGROWTH=1MB
)

/*
删除数据库
*/
DROP DATABASE TempDB

修改数据库名称

1
2
3
4
5
/*
语法:
EXEC sp_renamedb '旧库名','新库名'
*/
EXEC sp_renamedb 'OlderDB','NewDB'

创建表与删除表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/*
语法:
USE 数据库名
GO
CREATE TABLE.[dbo].表名
(
列名 数据类型 列约束,
列名 数据类型 列约束
)
*/
USE TempDB
GO
CREATE TABLE.[dbo].Temp_T
(
T_ID int IDENTITY(1,1) NOT NULL,
T_NAME nvarchar(10) NOT NULL
--建立唯一索引
CONSTRAINT PK_NAME PRIMARY KEY CLUSTERED
)

/*
删除表
*/
DROP TABLE Temp_T

向列中添加数据

1
2
3
4
5
6
7
8
9
/*
语法:
USE 数据库名
GO
INSERT INTO 表名(列名,列名) VALUES(列值,列值)
*/
USE TempDB
GO
INSERT INTO Temp_T(T_ID,T_NAME) VALUES(1,'数据')

更改列中的数据

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
语法:
USE 数据库名
GO
UPDATE 表名
SET 列名 = 新值
WHERE 列名 = 旧值
*/
USE TempDB
GO
UPDATE Temp_T
SET T_NAME = '2'
WHERE T_NAME = '1'

添加列和删除列

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
/*
语法:
USE 数据库名
GO
ALTER TABLE 目标表名 ADD 新列名 数据类型 约束
*/
USE TempDB
GO
ALTER TABLE Temp_T ADD T_AGE INT CHECK(T_AGE<=200)

/*
语法:
USE 数据库名
GO
ALTER TABLE 目标表名 DROP COLUMN 目标列名
*/
USE TempDB
GO
ALTER TABLE Temp_T DROP COLUMN T_AGE

更改列约束

1
2
3
4
5
6
7
8
9
/*
语法:
USE 数据库名
GO
ALTER TABLE 表名 ALTER COLUMN 目标列名 新数据类型 新约束
*/
USE TempDB
GO
ALTER TABLE Temp_T ALTER COLUMN T_NAME INT NULL

修改表名

1
2
3
4
5
6
7
8
9
/*
语法:
USE 数据库名
GO
EXEC sp_rename '旧表名', '新表名'
*/
USE TempDB
GO
EXEC Temp_T 'Older_T', 'New_T'

修改列名

1
2
3
4
5
6
7
8
9
/*
语法:
USE 数据库名
GO
EXEC sp_rename '目标表名.旧列名', '新列名', 'COLUMN'
*/
USE TempDB
GO
EXEC sp_rename 'Temp_T.T_ID', 'T_ID_', 'COLUMN'

内连查询

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
语法:
USE 数据库名
GO
SELECT 表1名.列名 AS 别名, 表2名.列名 AS 别名
FROM 表1名 INNER JOIN 表2名
ON 表1名.列名 = 表2名.列名
*/
USE TempDB
GO
SELECT Temp_A_T.T_NAME AS 编号, Temp_A_T.T_PWD AS 密码
FROM Temp_A_T INNER JOIN Temp_B_T
ON Temp_A_T.T_ID = Temp_B_T.T_ID

外连查询

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
/*
语法:
USE 数据库名
GO
SELECT 表1名.列名 AS 别名, 表2名.列名 AS 别名
FROM 表1名 LEFT JOIN 表2名
ON 表1名.列名 = 表1名.列名
注意:
左表全部显示,左有右无右显 NULL
权值高于 ON
*/
USE TempDB
GO
SELECT Temp_A_T.T_AGE AS 年龄, Temp_B_T.T_PWD AS 密码
FROM Temp_A_T LEFT JOIN Temp_B_T
ON Temp_A_T.T_ID = Temp_B_T.T_ID

/*
语法:
USE 数据库名
GO
SELECT 表1名.列名 AS 别名, 表2名.列名 AS 别名
FROM 表1名 RIGHT JOIN 表2名
ON 表1名.列名 = 表1名.列名
注意:
右表全部显示,右有左无左显 NULL
权值高于 ON
*/
USE TempDB
GO
SELECT Temp_A_T.T_AGE AS 年龄, Temp_B_T.T_PWD AS 密码
FROM Temp_A_T RIGHT JOIN Temp_B_T
ON Temp_A_T.T_ID = Temp_B_T.T_ID

/*
语法:
USE 数据库名
GO
SELECT 表1名.列名 AS 别名, 表2名.列名 AS 别名
FROM 表1名 FULL JOIN 表2名
ON 表1名.列名 = 表1名.列名
注意:
左右表全部显示,谁无谁显 NULL
权值高于 ON
*/
USE TempDB
GO
SELECT Temp_A_T.T_AGE AS 年龄, Temp_B_T.T_PWD AS 密码
FROM Temp_A_T FULL JOIN Temp_B_T
ON Temp_A_T.T_ID = Temp_B_T.T_ID

交叉连接

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
语法:
USE 数据库名
GO
SELECT 表1名.列名 AS 别名, 表2名.列名 AS 别名
FROM 表1名 CROSS JOIN 表2名
注意:
交叉连接中,一个表的每一行与另一个表的每一行合并,形成笛卡尔乘积。表1的行数乘以表2的行数等于笛卡尔乘积的大小
*/
USE TempDB
GO
SELECT Temp_A_T.T_NAME AS 编号, Temp_B_T.T_PWD AS 密码
FROM Temp_A_T CROSS JOIN Temp_B_T

表的导入

1

创建视图

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
/*
判断是否存在同名视图语法:
USE 数据库名
GO
IF EXISTS (SELECT NAME FROM sys.views WHERE name=N'视图名')

创建视图语法(单表):
USE 数据库名
GO
CREATE VIEW 视图名
AS
SELECT 列名, 列名
FROM dbo.表名

创建视图语法(跨表):
USE 数据库名
GO
CREATE VIEW 视图名
AS
SELECT 表1名.列名, 表2名.列名
FROM dbo.表1名 INNRE JOIN dbo.表2名
ON 表1名.列名 = 表2名.列名

创建加密视图语法:
USE 数据库名
GO
CREATE VIWE 视图名
WITH ENCRYPTION
AS
SELECT 列名, 列名
FROM dbo.表名
*/
USE TempDB
GO
IF EXISTS (SELECT NAME FROM sys.views WHERE name=N'Temp_V')
DROP VIEW Temp_V
GO
CREATE VIEW Temp_V
AS
SELECT T_ID, T_NAME, T_AGE
FROM Temp_T
SELECT * FROM Temp_V
DROP VIEW Temp_V

USE TempDB
GO
IF EXISTS (SELECT NAME FROM sys.views WHERE name=N'Temp_A_B_V')
DROP VIEW Temp_A_B_V
GO
CREATE VIEW Temp_A_B_V
AS
SELECT Temp_A_T.T_ID, Temp_B_T.T_PWD
FROM dbo.Temp_A_T INNER JOIN dbo.Temp_B_T
ON Temp_A_T.T_ID = Temp_B_T.T_ID
SELECT * FROM Temp_A_B_V
DROP VIEW Temp_A_B_V

修改视图名

1
2
3
4
5
/*
语法:
EXEC sp_rename '旧视图名', '新视图名', N'OBJECT'
*/
EXEC sp_rename 'Older_V', 'New_V', N'OBJECT'

更改视图的定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
/*
语法:
USE 数据库名
GO
ALERT VIEW 视图名
AS
SELECT 列名,列名
FROM 表名
WHERE 列名 = '值'
*/
USE TempDB
GO
ALTER VIEW Temp_V
AS
SELECT T_ID
FROM Temp_T
WHERE T_ID = '110'

运算符、函数、流程控制

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
/*
一、运算符
1、逻辑运算符
ALL
AND
ANY
BETWEEN
EXISTS 不为空
IN 含于
LIKE
NOT
OR
SOME
2、比较运算符
!>
!= <>
!<
*/

/*
二、函数
1、聚合函数
MAX 最大值
MIN 最小值
SUM 求和
AVG 求平均
COUNT 统计个数
2、加密函数
EncryptByKey 使用对称密钥加密
DecryptByKey 使用对称密钥解密
EncryptByPassPhrase 使用同行短语加密
DecryptByPassPhrase 使用同行短语解密
3、日期和时间函数
GETDATE 获取计算机时间
GETUTCDATE 获取计算机时间(UTC)
DATEADD 给指定日期加上时间间隔
YEAR 年
MONTH 月
DAY 日
4、数学函数
ABS 绝对值
RAND 0~1之间的随机float值
5、字符串函数
LEFT 返回字符串从左开始指定个数的字符
LEN 返回字符串的字符个数不包括尾部的空格
LOWER 将大写转换为小写
UPPER 将小写转换为大写
LTRIM 去前空格
RTRIM 去后空格
PATINDEX 返回字符(字符串)第一次出现的起始位置,没有则返回“0”
REPLACE 用第三个表达式替换第一个表达式中出现的所有的第二个表达式
REVERSE 字符串颠倒
6、系统函数
CURRENT_TIMESTAMP 返回日期和时间
CURRENT_USER 返回当前用户的名称
ISDATE 判断是否为有效日期
*/

/*
三、流程控制语句
1、BEGIN...END 用来将语句组织在一起形成语句块一起执行起到“{”,“}”的作用
2、GOTO 跳转
3、IF...ELSE 条件选择
4、WHILE 循环
5、CONTINUE 跳出本次循环
6、BREAK 结束循环
7、RETURN 返回
8、WAITFOR
9、TRY...CATCH
*/

申明变量

1
2
3
4
5
6
7
/*
语法:
DECLARE @变量名 数据类型 = 初始值;
注意:
数据类型不能是 TEXT,NTEXT,IMAGE
*/
DECLARE @i INT = 0;

存储过程

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/*
判断存储过程是否存在语法:
IF EXISTS(SELECT name FROM sysobject WHERE name = '存储过程名')
DROP PROCEDURE 存储过程名
*/
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'Temp_P')
DROP PROCEDURE Temp_P

/*
创建存储过程语法:
USE 数据库名
GO
CREATE PROCEDURE 存储过程名
AS
T_SQL语句
*/
USE TempDB
GO
CREATE PROCEDURE Temp_P
AS
DECLARE @i INT = 0
WHILE @i<10
BEGIN
PRINT('TEST')
SET @i+ = 1
END

/*
执行存储过程语法:
EXEC 存储过程名
*/
EXEC Temp_P

/*
带有参数的存储过程语法:
USE 数据库名
GO
IF EXISTS(SELECT name FROM sysobject WHERE name = '存储过程名')
DROP PROCEDURE 存储过程名
GO
CREATE PROCEDURE 存储过程名
@参数名 数据类型,
@参数名 数据类型
AS
T_SQL语句
GO
*/
USE TempDB
GO
IF EXISTS(SELECT name FROM sysobjects WHERE name = 'T_PEOCEDURE')
DROP PROCEDURE Temp_P
GO
CREATE PROCEDURE Temp_P
@A INT,
@B INT
AS
SELECT * FROM TEST_tb
WHERE @A = T_ID AND @B = T_NAME
GO

/*
执行带有参数的存储过程语法:
EXEC 存储过程名 '参数值','参数值'
(如果该过程是批处理中的第一条语句则可使用 "存储过程名 '参数值','参数值'" 执行)
*/
EXEC Temp_P '110','121'
--OR
Temp_P '110','121'

添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
/*
使用INSERT…SELECT进行批处理添加语法:
USE 数据库名
GO
--创建一个要添加数据的表
CREATE TABLE 表名
(
列名 数据类型 列约束,
列名 数据类型 列约束,
列名 数据类型 列约束
)
GO
--插入数据
INSERT 要插入数据的表 (使用 "INSERT TOP(数字或百分数) 表名" 可插入指定的行数)
SELECT 列名, 列名, 列名
FROM 查询的表
GO
--查看结果
SELECT * FROM 插入数据的表
--删除测试用表
DROP TABLE 插入数据的表
*/
USE TempDB
GO
CREATE TABLE Temp_Insert_T
(
COLUMN1 NVARCHAR(MAX),
COLUMN2 NVARCHAR(MAX),
COLUMN3 NVARCHAR(MAX)
)
GO
INSERT Temp_Insert_T
SELECT T_ID, T_NAME, T_AGE
FROM Temp_T
GO

SELECT * FROM Temp_Insert_T
DROP TABLE Temp_Insert_T

/*
使用SELECT…INTO进行批处理添加语法:
USE 数据库名
GO
IF EXISTS(SELECT name FROM sys.tables WHERE name=N'表名')
DROP TABLE 表名
--自动建立表并将SELECT结果插入表中
SELECT 列名, 列名, 列名 (如果在查询的时候使用了别名则将以别名作为自动建立表的列名)
INTO 要建立并插入SELECT数据的表
FROM 查询的表
GO
SELECT * FROM 建立并插入SELECT数据的表
DROP TABLE 建立并插入SELECT数据的表
*/
USE TempDB
GO
IF EXISTS(SELECT name FROM sys.tables WHERE name=N'Temp_Insert_T')
DROP TABLE Temp_Insert_T
SELECT T_ID AS COLUMN1, T_NAME AS COLUMN2, T_AGE AS COLUMN3
INTO Temp_Insert_T
FROM Temp_T
GO

SELECT * FROM Temp_Insert_T
DROP TABLE Temp_Insert_T

/*
使用存储过程的查询结果添加语法:
USE 数据库名
GO
--建立用于查询的简单存储过程
IF EXISTS(SELECT name FROM sysobjects WHERE name='存储过程名')
DROP PROCEDURE 存储过程名
GO
CREATE PROCEDURE 存储过程名
AS
BEGIN
T_SQL语句
END
GO
--用存储过程向表里插入数据
INSERT INTO 表名(列名, 列名) EXEC 存储过程名
GO
SELECT * FROM 表名
GO
*/
USE TempDB
GO
--建立测试数据表Temp_T
IF EXISTS(SELECT name FROM sys.tables WHERE name=N'Temp_T')
DROP TABLE Temp_T
GO
CREATE TABLE Temp_T
(
ID INT,
A VARCHAR(10),
B VARCHAR(10)
)
GO
--向测试数据表里添加数据
INSERT INTO Temp_T(ID, A, B)
SELECT 1, 'A1', 'B2'
UNION ALL SELECT 2, 'A2', 'B2'
UNION ALL SELECT 3, 'A3', 'B3'
UNION ALL SELECT 4, 'A4', 'B4'
UNION ALL SELECT 5, 'A5', 'B5'
UNION ALL SELECT 6, 'A6', 'B6'
UNION ALL SELECT 7, 'A7', 'B7'
UNION ALL SELECT 8, 'A8', 'B8'
UNION ALL SELECT 9, 'A9', 'B9'
GO
--建立用于查询的简单存储过程Temp_P
IF EXISTS(SELECT name FROM sysobjects WHERE name='Temp_P')
DROP PROCEDURE Temp_P
GO
CREATE PROCEDURE Temp_P
AS
BEGIN
SELECT ID, A
FROM Temp_T
END
GO
--建立用于插入数据的Temp_Insert_T表
IF OBJECT_ID(N'Temp_Insert_T')IS NOT NULL
DROP TABLE Temp_Insert_T
CREATE TABLE Temp_Insert_T
(
ID INT,
a VARCHAR(10)
)
GO
--用存储过程Temp_P向Temp_Insert_T表里插入数据
INSERT INTO test(ID, a) EXEC Temp_P
GO
SELECT * FROM Temp_Insert_T
GO

修改

1
2
3
4
5
6
7
8
9
10
11
/*
使用UPDATE TOP修改数据记录语法:
USE 数据库名
GO
UPDATE TOP(数字或百分数) 表名 SET 列名 = 新值
GO
*/
USE TempDB
GO
UPDATE TOP(5) Temp_T SET T_AGE = T_AGE*10
GO

删除

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
/*
使用DELETE TOP删除数据记录语法:
USE 数据库名
GO
DELETE TOP(数字或百分数) 表名
GO
*/
USE TempDB
GO
DELETE TOP(2) Temp_T
GO

/*
使用带OUTPUT子句的DELETE删除数据记录并返回已删除数据的记录集语法:
USE 数据库名
GO
DELETE 表名
OUTPUT DELETED.*
GO
*/
USE TempDB
GO
DELETE Temp_T
OUTPUT DELETED.* ;
GO

/*
使用TRUNCATE TABLE表达式高效清空数据记录语法:
USE 数据库名
GO
TRUNCATE TABLE 表名
GO
*/
USE TempDB
GO
TRUNCATE TABLE Temp_T
GO

汇总和分组数据

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
/*
使用GROUP BY分类汇总语法:
USE 数据库名
GO
SELECT 列名, COUNT(列名) AS NUMBER
FROM 表名 GROUP BY 列名
*/
USE TempDB
GO
SELECT T_AGE, COUNT(T_AGE) AS NUMBER
FROM Temp_T GROUP BY T_AGE

/*
使用WITH CUBE对GROUP BY分类汇总的数据进行统计
*/
USE TempDB
GO
SELECT T_AGE, COUNT(T_AGE) AS NUMBER
FROM Temp_T GROUP BY T_AGE WITH CUBE

/*
使用COMPUTE在查询的同时进行汇总语法:
USE 数据库名
GO
SELEST 列名, 列名
FROM 表名
COMPUTER {AVG|COUNT|MAX|MIN|SUM}(列名)
*/
USE TempDB
GO
SELECT T_ID ID, T_AGE 年龄
FROM Temp_T
COMPUTE AVG(T_AGE)

/*
使用ORDER BY与COMPUTE BY在查询的同时进行汇总语法:
USE 数据库名
GO
--以年龄为条件进行分组查询
SELECT 列名, 列名, 列名
FROM 表名 ORDER BY 分组依据列列名
--以年龄为条件计算各分组ID的平均值
COMPUTE AVG(列名) BY 列名
*/
USE TempDB
GO
SELECT T_ID ID, T_NAME NAME, T_AGE AGE
FROM Temp_T ORDER BY T_AGE
COMPUTE AVG(T_ID) BY T_AGE

模糊查询

1
2
3
4
5
6
7
8
9
10
11
12
13
/*
使用LIKE与通配符进行模糊查询
通配符:
% 包含零个或多个字符的字符串
_ 任何单个字符
[] 指定范围([a-z])或集合([abcdef])中的任何单个字符
[^] 不属于指定范围([a-z])或集合([abcdef])中的任何单个字符
*/
USE TempDB
GO
SELECT *
FROM Temp_T
WHERE T_NAME LIKE '%A%'

全文索引

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
--查询数据库的排序规则
SELECT name, collation_name FROM SYS.databases

--启用全文索引
--重要:在SQL Server 2008 或更高的版本中所有数据库自动启用全文索引功能,支持 sp_fulltext_database 只是为了保持软件的向下兼容性
USE TempDB
GO
EXEC sp_fulltext_database 'enable'

/*
创建全文目录语法:
USE 数据库名
GO
CREATE FULLTEXT CATALOG 全文目录名
IN PATH '目录路径'
--设为默认路径
AS DEFAULT
GO
*/
USE TempDB
GO
IF OBJECT_ID(N'Temp_FT')IS NOT NULL
DROP FULLTEXT CATALOG Temp_FT
GO
CREATE FULLTEXT CATALOG Temp_FT
IN PATH 'F:\\'
AS DEFAULT
GO

--删除全文目录
DROP FULLTEXT CATALOG Temp_FT

/*
创建全文索引语法:
USE 数据库名
GO
CREATE FULLTEXT INDEX ON 全文索引的表(表中的列)
KEY INDEX 唯一索引名
GO
*/
USE TempDB
GO
CREATE FULLTEXT INDEX ON TEST_tb(T_NAME)
KEY INDEX PK_NAME
GO

--删除全文索引
DROP FULLTEXT INDEX ON TEST_tb

/*
使用CONTAINS可以搜索:
简单词:
一个词 CONTAINS(列名, '词')
多个词 CONTAINS(列名, '"词"{or|and|and not}"词"')
由多个词组成的短语 CONTAINS(列名, '"词 词"')
前缀词:
派生词:
加权词:
邻近词:
*/
USE TempDB
GO
SELECT * FROM TEST_tb WHERE CONTAINS(T_NAME, '"TEST ONE"')

/*
使用FREETEXT可以搜索:
字符串中的单个词 FREETEXT(列名, 'TEST ONE') 只要有一个词匹配就会被罗列出来
整个字符串:
整个汉语词语:
*/
USE TempDB
GO
SELECT * FROM TEST_tb WHERE FREETEXT(T_NAME, '"TEST ONE"')

/*
使用CONTAINSTABLE进行全文搜索语法:
CONTAINSTABLE(表名, 列名, '词')
*/
USE TempDB
GO
SELECT * FROM CONTAINSTABLE(TEST_tb, T_NAME, 'TEST')

--利用CONTAINSTABLE返回结果集中的KEY与原表主键的对等关系查看原表数据
SELECT *
FROM TEST_tb INNER JOIN CONTAINSTABLE(TEST_tb, T_NAME, 'TEST') AS Temp_FT
ON Temp_FT.[KEY]=TEST_tb.T_NAME

--利用CONTAINSTABLE返回结果集中的PANK加权改变结果集的排序
SELECT *
FROM TEST_tb INNER JOIN CONTAINSTABLE(TEST_tb, T_NAME, 'ISABOUT (测试 weight(.9), TEST weight(.1))') AS Temp_FT
ON Temp_FT.[KEY]=TEST_tb.T_NAME

/*
使用FREETEXTTABLE进行全文搜索语法:
CONTAINSTABLE(表名, 列名, '词')
*/
USE TempDB
GO
SELECT * FROM FREETEXTTABLE(TEST_tb, T_NAME, '"TEST ONE"')

创建触发器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
/*
用FOR创建当对表进行INSERT、UPDATE、DELETE操作时触发的触发器
*/
USE TempDB
GO
IF OBJECT_ID(N'Temp_TG')IS NOT NULL
DROP TRIGGER Temp_TG
GO
CREATE TRIGGER Temp_TG
ON Temp_T
FOR INSERT,UPDATE,DELETE
AS
EXEC master..xp_sendmail 'mail@domain.com',
'表Temp_T已被更改'

/*
用INSTEAD OF创建当对表进行INSERT、UPDATE、DELETE操作时触发,并用定义好的T_SQL语句代替INSERT、UPDATE、DELETE操作的触发器
*/
USE TempDB
GO
IF OBJECT_ID(N'Temp_TG')IS NOT NULL
DROP TRIGGER Temp_TG
GO
CREATE TRIGGER Temp_TG
ON Temp_T
INSTEAD OF DELETE
AS
DELETE Temp_T
WHERE T_ID=(SELECT MIN(T_ID) FROM Temp_T)

/*
用IF UPDATE创建当对某一列进行INSERT、UPDATE操作时触发,且当列的值发生改变时触发IF UPDATE子句的触发器
*/
USE TempDB
GO
IF OBJECT_ID(N'Temp_TG')IS NOT NULL
DROP TRIGGER Temp_TG
GO
CREATE TRIGGER Temp_TG
ON Temp_T
FOR UPDATE
AS
IF UPDATE(T_NAME) OR UPDATE(T_AGE)
DELETE Temp_T
WHERE T_ID=(SELECT MIN(T_ID) FROM Temp_T)

--查看触发器
USE TempDB
GO
SELECT * FROM sysobjects WHERE xtype='TR'
--查看触发器代码内容
USE TempDB
GO
EXEC sp_helptext 'sa_tg'
--禁用触发器
USE TempDB
GO
ALTER TABLE Temp_T
DISABLE TRIGGER sa_tg --DISABLE禁用 ENABLE启用 ALL所有

--使用ROLLBACK TRANSACTION创建回滚触发器
--指定AFTER触发器的触发顺序
/*
EXEC sp_settriggerorder
'触发器名称','{FIRST|LAST|NONE}','激发动作'
*/
--DDL触发器
/*
CREATE TRIGGER TempDBTG
ON TempDB --ON {ALL|数据库名}
FOR 触发DLL触发器的事件
AS
T_SQL语句
*/
--DML触发器
/*
AFTER 触发器不能用在视图上,INSTEAD OF既可以用在数据表上也可以用在视图上
*/
--CLR触发器
--SQL SERVER为触发器定义的两个虚拟表 INSERTED DELETED

捕捉异常

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
/*
捕捉异常
*/
BEGIN TRY
-- Generate divide-by-zero error.
SELECT 1/0;
END TRY
BEGIN CATCH
SELECT
ERROR_NUMBER() AS 错误号,
ERROR_SEVERITY()AS 严重性,
ERROR_STATE()AS 错误状态号,
ERROR_PROCEDURE() AS 出现错误的存储过程或触发器,
ERROR_LINE() AS 导致错误的例程中的行号,
ERROR_MESSAGE() AS 错误消息完整文本
END CATCH

作业和警报

1

加密解密

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
/*
创建数据库主密钥语法:
USE 数据库名
GO
CREATE MASTER KEY
ENCRYPTION BY PASSWORD='加密密钥'
删除数据库主密钥语法:
USE 数据库名
GO
DROP MASTER KEY
GO
*/
USE TempDB
GO
CREATE MASTER KEY ENCRYPTION
BY PASSWORD = '000000'
GO
--DROP MASTER KEY

/*
创建证书语法:
USE 数据库名
GO
CREATE CERTIFICATE 证书名
WITH SUBJECT='加密密钥'
GO
*/
USE TempDB
GO
CREATE CERTIFICATE Temp_Card
WITH SUBJECT='000000'
GO
--DROP CERTIFICATE Temp_Card

/*
创建对称密钥(由数据库主密钥加密)语法:
USE 数据库名
GO
CREATE SYMMETRIC KEY 对称密钥名
WITH ALGORITHM = 加密算法
ENCRYPTION BY PASSWORD='加密密钥'
创建对称密钥(由证书加密)语法:
USE TempDB
GO
CREATE SYMMETRIC KEY 对称密钥名
WITH ALGORITHM = 加密算法
ENCRYPTION BY CERTIFICATE 证书名
GO
删除对称密钥语法:
DROP SYMMETRIC KEY 对称密钥名
*/
USE TempDB
GO
CREATE SYMMETRIC KEY Temp_Key
WITH ALGORITHM = AES_256
ENCRYPTION BY PASSWORD='000000'
GO
----or----
USE TempDB
GO
CREATE SYMMETRIC KEY Temp_Key
WITH ALGORITHM = AES_256
ENCRYPTION BY CERTIFICATE Temp_Card
GO
--DROP SYMMETRIC KEY Temp_Key

/*
打开密钥(由数据库主密钥加密)语法:
OPEN SYMMETRIC KEY 密钥名
DECRYPTION BY PASSWORD='加密密钥'
打开密钥(由证书加密)语法:
OPEN SYMMETRIC KEY 密钥名
DECRYPTION BY CERTIFICATE 证书名
关闭密钥语法:
CLOSE SYMMETRIC KEY 密钥名
*/
OPEN SYMMETRIC KEY Temp_Key
DECRYPTION BY PASSWORD='000000'
----or----
OPEN SYMMETRIC KEY Temp_Key
DECRYPTION BY CERTIFICATE Temp_Card
--CLOSE SYMMETRIC KEY Temp_Key

/*
加密语法:
ENCRYPTBYKEY(KEY_GUID('密钥名'),'目标数据')
解密语法:
CONVERT(解密后的数据类型,DECRYPTBYKEY(目标数据))
*/
INSERT INTO Temp_T(T_NAME,TO_ENTRYPT) VALUES('Information',ENCRYPTBYKEY(KEY_GUID('Temp_Key'),'Information'))
--------解密--------
SELECT CONVERT(VARCHAR,DECRYPTBYKEY(TO_ENTRYPT))
FROM Temp_T
WHERE T_NAME = 'Information'

SQL Server报表

1

访问SQL Server

1

SQL Server与Office

1

批量添加

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
USE TempDB
GO
TRUNCATE TABLE Temp_T

--全表属性赋值添加
USE TempDB
GO
INSERT INTO Temp_T
SELECT 'Data_1', 1
UNION ALL SELECT 'Data_2', 2
UNION ALL SELECT 'Data_3', 3

--部分属性赋值添加
USE TempDB
GO
INSERT INTO Temp_T
(T_NAME, T_ID)
VALUES
('Data_1', 1),
('Data_2', 2)
GO

清空所有表

1
exec sp_msforeachtable  @Command1 ='truncate table ?'