1. 构建SQL Server参照表
如果您是一名数据库管理员或者开发人员,那么构建SQL Server参照表一定不会陌生。SQL Server参照表是一种存储数据库对象定义的元数据表,它包含了SQL Server数据库中的各种对象,如表、视图、存储过程和触发器等。
SQL Server参照表通常由系统表和视图组成,它们存储在数据库引擎的系统数据库内。系统表和视图表的结构被数据库引擎定义,因此它们是只读的。
下面是SQL Server中常见的系统表和视图:
sys.objects:存储数据库中的所有对象。
sys.columns:存储表中列的信息。
sys.indexes:存储表中索引的信息。
sys.procedures:存储存储过程的信息。
sys.triggers:存储触发器的信息。
1.1 sys.objects
sys.objects表存储了SQL Server数据库中存在的所有对象信息,包括表、视图、存储过程、函数、索引等。此表的结构如下:
CREATE TABLE sys.objects (
object_id INT -- 对象的编号
name SYSNAME -- 对象的名称
schema_id INT -- 对象所属的模式的编号
type CHAR(2) -- 对象的类型(例如:U表示表,V表示视图,P表示存储过程,TF表示表值函数等)
create_date DATETIME -- 对象的创建日期
modify_date DATETIME -- 对象的更改日期
is_ms_shipped BIT -- 该对象是否是系统内置对象
is_published BIT -- 该对象是否在发布过程中使用
is_schema_published BIT -- 该对象所属模式是否在发布过程中使用
我们可以利用sys.objects表来查询数据库中所有表的信息,比如数据库AdventureWorks中所有的表:
USE AdventureWorks;
SELECT name, create_date, modify_date
FROM sys.objects
WHERE type = 'U';
1.2 sys.columns
sys.columns表存储了SQL Server数据库中所有表的列信息。此表的结构如下:
CREATE TABLE sys.columns (
object_id INT -- 表的编号
name SYSNAME -- 列的名称
column_id INT -- 列在表中的编号
system_type_id TINYINT -- 列的数据类型编号
user_type_id INT -- 列的用户定义的数据类型编号
max_length SMALLINT -- 列的最大长度
precision TINYINT -- 列的总位数(仅适用于数字类型)
scale TINYINT -- 列的小数位数(仅适用于数字类型)
is_nullable BIT -- 列是否可为空值
is_ansi_padded BIT -- 列是否使用ANSI填充格式
is_identity BIT -- 列是否是IDENTITY列
)
我们可以使用sys.columns表来查询表的列信息,比如查询AdventureWorks数据库中HumanResources.Employee表中所有列的信息:
USE AdventureWorks;
SELECT name, system_type_id, is_nullable
FROM sys.columns
WHERE object_id = OBJECT_ID('HumanResources.Employee');
2. 实现信息存储
在SQL Server中,我们可以使用表、视图、存储过程、触发器等对象来存储和处理信息。
2.1 创建表
CREATE TABLE语句用于创建一个新的表。语法如下:
CREATE TABLE table_name (
column1 datatype [ NULL | NOT NULL ],
column2 datatype [ NULL | NOT NULL ],
...
CONSTRAINT constraint_name PRIMARY KEY (column1, column2, ...),
CONSTRAINT constraint_name FOREIGN KEY (column_name) REFERENCES parent_table (column_name)
);
比如,我们可以创建一个人员信息表来存储公司员工的基本信息,并定义一个主键和外键约束:
CREATE TABLE Employee (
empid INT PRIMARY KEY,
lastname VARCHAR(50) NOT NULL,
firstname VARCHAR(50) NOT NULL,
title VARCHAR(50),
hiredate DATE,
reports_to INT,
CONSTRAINT FK_EmployeeReportsTo FOREIGN KEY (reports_to) REFERENCES Employee(empid)
);
在上面的语句中,我们创建了一个名为Employee的表,它包含empid、lastname、firstname、title、hiredate和reports_to等列。同时,我们定义了一个主键约束来保证empid列的唯一性,并定义了一个名为FK_EmployeeReportsTo的外键约束,该约束确保reports_to列的值在empid列中存在。
2.2 创建视图
CREATE VIEW语句用于创建一个虚拟表。它是一个SELECT语句的结果集,并可以在查询中使用。语法如下:
CREATE VIEW view_name AS
SELECT column1, column2, ...
FROM table_name
WHERE condition;
比如,我们可以创建一个视图来显示公司所有员工的姓名和职位:
CREATE VIEW EmployeeNameTitle AS
SELECT lastname + ', ' + firstname AS FullName, title
FROM Employee;
从上面的例子中我们可以看出,视图可以从一个或多个表中选择列来组成。在实际应用中,通过创建视图可以简化查询的复杂度,并减少对外部表的访问次数,提高查询效率。
2.3 创建存储过程
CREATE PROCEDURE语句用于创建存储过程。存储过程是一组预定义的SQL语句,它们可以被多次调用,并分配给一个过程名称。语法如下:
CREATE PROCEDURE procedure_name
AS
BEGIN
SQL statements
END;
比如,我们可以创建一个以工号为参数的存储过程,用于删除与该工号相关的信息:
CREATE PROCEDURE DeleteEmployee
@empid INT
AS
BEGIN
DELETE FROM Employee WHERE empid = @empid;
END;
存储过程可以包含参数,可以返回值,并可以嵌套在其他的存储过程或查询中。存储过程在提高应用程序性能,数据安全性等方面都有着非常重要的作用。
2.4 创建触发器
CREATE TRIGGER语句用于创建触发器。触发器是一种特殊的存储过程,它可以在INSERT、UPDATE和DELETE操作之前或之后自动执行。语法如下:
CREATE TRIGGER trigger_name
ON table_name
FOR [INSERT|UPDATE|DELETE]
AS
BEGIN
SQL statements
END;
比如,我们可以创建一个在Employee表INSERT、UPDATE和DELETE操作后自动执行的触发器,并将相关信息记录到日志表中:
CREATE TRIGGER tr_log_employee_changes
ON Employee
AFTER INSERT, UPDATE, DELETE
AS
BEGIN
IF @@ROWCOUNT = 0 RETURN;
DECLARE @change_type CHAR(1);
IF EXISTS(SELECT * FROM inserted)
IF EXISTS(SELECT * FROM deleted)
SET @change_type = 'U';
ELSE
SET @change_type = 'I';
ELSE
SET @change_type = 'D';
INSERT INTO Log_EmployeeChanges
SELECT @change_type, GETDATE(), *, SYSTEM_USER
FROM inserted
INSERT INTO Log_EmployeeChanges
SELECT @change_type, GETDATE(), *, SYSTEM_USER
FROM deleted
END;
从上面的例子中我们可以看出,使用触发器可以在数据发生变化时自动执行一些操作,实现业务逻辑。
总结
本文介绍了SQL Server参照表的构建以及SQL Server中常见的信息存储方式,包括表、视图、存储过程和触发器等。通过学习本文,读者可以掌握如何使用SQL Server参照表来查询数据库信息,并掌握SQL Server中常见的信息存储方式,为实现业务逻辑提供便利。