接着上篇文章SQL 表结构信息查询 含主外键、自增长 里面提到了INFORMATION_SCHEMA视图,其实到了SQL 2005微软都主推大家使用INFORMATION_SCHEMA系统视图,而不是在使用sys东东了,当然目前还是有许多信息只能通过sys视图来查询。这里我们还是以查询表结果信息为例来说明一些主要的INFORMATION_SCHEMA视图的使用。
首先我们需要查询列的信息,这需要用到[INFORMATION_SCHEMA].[COLUMNS]系统视图来查询数据列的信息,SQL 如下:
SELECT c.TABLE_SCHEMA , c.TABLE_NAME , c.COLUMN_NAME , c.DATA_TYPE , c.CHARACTER_MAXIMUM_LENGTH , c.COLUMN_DEFAULT , c.IS_NULLABLE , c.NUMERIC_PRECISION , c.NUMERIC_SCALEFROM [INFORMATION_SCHEMA].[COLUMNS] cWHERE TABLE_NAME = 'Address'
运行结果如下:
我们都知道我们在定义列的时候一般的使用都是varchar(50)之类的信息,这里我们需要整合DATA_TYPE和CHARACTER_MAXIMUM_LENGTH信息,当CHARACTER_MAXIMUM_LENGTH为-1时即使说没有指定具体最大长度,数据的指定长度信息是max,而numeric需要整合NUMERIC_PRECISION、NUMERIC_SCALE信息。修改后的SQL如下:
SELECT c.TABLE_SCHEMA , c.TABLE_NAME , c.COLUMN_NAME , CASE WHEN ( ( CHARINDEX('char', c.DATA_TYPE) > 0 OR CHARINDEX('binary', c.DATA_TYPE) > 0 ) AND c.CHARACTER_MAXIMUM_LENGTH <> -1 ) THEN c.DATA_TYPE + '(' + CAST(c.CHARACTER_MAXIMUM_LENGTH AS VARCHAR(4)) + ')' WHEN ( ( CHARINDEX('CHAR', c.DATA_TYPE) > 0 OR CHARINDEX('binary', c.DATA_TYPE) > 0 ) AND c.CHARACTER_MAXIMUM_LENGTH = -1 ) THEN c.DATA_TYPE + '(max)' WHEN ( CHARINDEX('numeric', c.DATA_TYPE) > 0 ) THEN c.DATA_TYPE + '(' + CAST(c.NUMERIC_PRECISION AS VARCHAR(4)) + ',' + CAST(c.NUMERIC_SCALE AS VARCHAR(4)) + ')' ELSE c.DATA_TYPE END AS DATA_TYPE , c.COLUMN_DEFAULT , c.IS_NULLABLE , c.COLUMN_DEFAULTFROM [INFORMATION_SCHEMA].[COLUMNS] cWHERE TABLE_NAME = 'Address'ORDER BY c.ORDINAL_POSITION
运行结果如图:
现在我们需要标记这张表的那些列是主键,那些列是外键,要查询表的主、外键信息需要用到[INFORMATION_SCHEMA].[TABLE_CONSTRAINTS]和[INFORMATION_SCHEMA].[KEY_COLUMN_USAGE] 系统视图
运行结果如图:
修改我们先前的SQL语句:
今天用到了row_number()over(),现在就以知识点的形式总结一下,以便于以后的回顾。
-------------------参考资料MSDN-------------------
语法:
ROW_NUMBER ( ) OVER ( [ PARTITION BY value_expression , ... [ n ] ] order_by_clause )
通过语法可以看出 over里有两个参数, partition by 和 order by ,其中partition by是可以不写的,但是order by是必须有的。可能对order by 比较熟悉(就是按什么排序),但 partition by是什么意思呢?partition 的中文解释是:n. 划分,分开;[数] 分割;隔墙;隔离物 vt. [数] 分割;分隔;区分。让我们再结合下面的参数说明和实例很容易就理解它的含义了。
参数:
PARTITION BY value_expression 将 FROM 子句生成的结果集划入应用了 ROW_NUMBER 函数的分区。 value_expression 指定对结果集进行分区所依据的列。 如果未指定 PARTITION BY,则此函数将查询结果集的 所有行视为单个组。 order_by_clause ORDER BY 子句可确定在特定分区中为行分配唯一 ROW_NUMBER 的顺序。返回值类型:
bigint(长整型)
以上是对row_number()over()的理论了解,现在开始用例子演示:
先建表(dbo.PeopleInfo):
CREATE TABLE [dbo].[PeopleInfo]( [id] [int] IDENTITY(1,1) NOT NULL, [name] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [Gender] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [numb] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [phone] [nchar](10) COLLATE Chinese_PRC_CI_AS NULL, [FenShu] [int] NULL) ON [PRIMARY]
向表中插入数据:
insert into peopleinfo([name],Gender,numb,phone,fenshu) values ('李欢','男','3223','1365255',80)insert into peopleinfo([name],Gender,numb,phone,fenshu) values ('李欢','男','322123','1',90)insert into peopleinfo([name],Gender,numb,phone,fenshu) values (
数据库在项目开发中几乎是必不可少的元素,sql Server 相信大家都特别熟悉吧,那么是否遇到过这样一个问题呢:
在分析数据库或者部署数据库的时候,出现了数据库不兼容的问题。
修改数据库兼容版本
语法
ALTER DATABASE database_name
SET COMPATIBILITY_LEVEL = { 80 | 90 | 100 |110 }
参数
database_name
要修改的数据库的名称。
COMPATIBILITY_LEVEL { 80 | 90 | 100 |110}
要使数据库与之兼容的 SQL Server 版本。该值必须为下列值之一:
= SQL Server 2000
= SQL Server 2005
= SQL Server 2008
= SQL Server 2012
备注
对于所有 SQL Server 2012 安装,默认的兼容级别都为 110。除非 model 数据库有更低的兼容级别,否则 SQL Server 2012 中创建的数据库会设置为该级别。将数据库从 SQL Server 的任何早期版本升级到 SQL Server 2012 时,如果数据库的兼容级别不在 80 以下,则该数据库将保留其现有的兼容级别。升级兼容级别低于 80 的数据库会将数据库的兼容级别设置为 80。这既适用于系统数据库,也适用于用户数据库。使用 ALTER DATABASE 可更改数据库的兼容级别。若要查看数据库的当前兼容级别,请查询 sys.databases 目录视图中的 compatibility_level 列。
利用兼容级别获得向后兼容
兼容级别只影响指定数据库的行为,而不影响整个服务器的行为。兼容级别只实现与 SQL Server 的早期版本保持部分向后兼容。通过将兼容级别用作临时性的迁移辅助工具,可解决相关兼容级别设置控制的行为之间存在的版本差异问题。如果现有 SQL Server 应用程序受到 SQL Server 2012 中行为差异的影响,请对该应用程序进行转换,使之能正常运行。然后使用 ALTER DATABASE 将兼容级别更改为 110。数据库的新兼容性设置将在该数据库下次成为当前数据库(无论是在登录时作为默认数据库还是在 USE 语句中指定)时生效。
最佳实践
如果在用户连接到数据库时更改兼容级别,可能会使活动查询产生不正确的结果集。例如,如果在编写查询计划时兼容级别发生更改,则编写后的计划可能同时基于旧的和新的兼容级别,从而造成计划不正确,并可能导致结果不准确。此外,如果将计划放在计划缓存中供后续的查询重用,则问题可能更加复杂。为了避免查询结果不准确,建议您使用以下过程来更改数据库的兼容级别:
. 通过使用 ALTER DATABASE SET SINGLE_USER,将数据库设置为单用户访问模式。
. 更改数据库的兼容级别。
. 通过使用 ALTER DATABASE SET MULTI_USER,将数据库设为多用户访问模式。
有关设置数据库访问模式的详细信息,请参阅 ALTER DATABASE (Transact-SQL)。
1 --获取数据库兼容级别 2 SELECT name ,compatibility_level ,recovery_model_desc FROM sys.databases WITH(NOLOCK) 3 4 5 --将用户设置为单用户访问模式 6 ALTER DATABASE test SET SINGLE_USER 7 8 9 --修改数据库的兼容级别10 ALTER DATABASE TEST11 SET COMPATIBILITY_LEVEL = 9012 --or13 EXEC sp_dbcmptlevel TEST, 90;14 GO15 16 17 --将用户设置为多用户访问模式18 ALTER DATABASE test SET MULTI_USER
语法
sp_dbcmptlevel [ [ @dbname = ] name ]
[ , [ @new_cmptlevel = ] version ]
参数
[ @dbname = ] name
要为其更改兼容级别的数据库的名称。数据库名称必须符合标识符的规则。name 的数据类型为 sysname,默认值为 NULL。
[ @new_cmptlevel = ] version
数据库要与之兼容的 SQL Server 的版本。version 的数据类型为 tinyint,默认值为 NULL。该值必须为下列值之一:
= SQL Server 2000
= SQL Server 2005
= SQL Server 2008
= SQL Server 2012
返回代码值
(成功)或 1(失败)
结果集
如果未指定任何参数或未指定 name 参数,则 sp_dbcmptlevel 将返回错误。
如果指定 name 但未指定 version,则 数据库引擎将返回一条消息,显示指定数据库的当前兼容级别。
备注
有关兼容级别的说明,请参阅 ALTER DATABASE 兼容级别 (Transact-SQL)。
权限
只有数据库所有者、sysadmin 固定服务器角色和 db_owner 固定数据库角色的成员(前提是您要更改当前数据库)才能执行此过程。
本文链接