
sp_rename
释义:更改当前数据库中用户创建对象(如表、列或用户定义数据类型)的名称
语法如下:
sp_rename [ @objname = ] 'object_name' , [ @newname = ] 'new_name' [ , [ @objtype = ] 'object_type' ]参数:
1[@objname =] 'object_name' 是用户对象(表、视图、列、存储过程、触发器、默认值、数据库、对象或规则)或数据类型的当前名称。如果要重命名的对象是表中的一列,那么 object_name 必须为 tablecolumn 形式。如果要重命名的是索引,那么 object_name 必须为 tableindex 形式。object_name 为 nvarchar(776) 类型,无默认值。
2 [@newname =] 'new_name' 是指定对象的新名称。new_name 必须是名称的一部分,并且要遵循标识符的规则。newname 是 sysname 类型,无默认值。
3 [@objtype =] 'object_type' 是要重命名的对象的类型。object_type 为 varchar(13) 类型,其默认值为 NULL,可取下列值。
注意:
只能更改当前数据库中的对象名称或数据类型名称。大多数系统数据类型和系统对象的名称不能更改。
重命名视图时,sysobjects 表中有关该视图的信息将得到更新。重命名存储过程时,sysobjects 表中有关该过程的信息将得到更新。
每当重命名 PRIMARY KEY 或 UNIQUE 约束时,sp_rename 都会自动为相关联的索引重命名。如果重命名的索引与 PRIMARY KEY 约束相关联,那么 sp_rename 也会自动重命名主键。
修改列A名为B:
sp_rename 'table1colname','B','A'通过视图来访问数据 其优点是非常明显的 如可以起到数据保密 保证数据的逻辑独立性 简化查询 *** 作等等
但是 话说回来 SQL Server数据库中的视图并不是万能的 他跟表这个基本对象还是有重大的区别 在使用视图的时候 需要遵守四大限制
限制条件一 视图数据的更改
当用户更新视图中的数据时 其实更改的是其对应的数据表的数据 无论是对视图中的数据进行更改 还是在视图中插入或者删除数据 都是类似的道理 但是 不是所有视图都可以进行更改 如下面的这些视图 在SQL Server数据库中就不能够直接对其内容进行更新 否则 系统会拒绝这种非法的 *** 作
如在一个视图中 若采用Group By子句 对视图中的内容进行了汇总 则用户就不能够对这张视图进行更新 这主要是因为采用Group By子句对查询结果进行汇总在后 视图中就会丢失这条纪录的物理存储位置 如此 系统就无法找到需要更新的纪录 若用户想要在视图中更改数据 则数据库管理员就不能够在视图中添加这个Group BY分组语句
如不能够使用Distinct关键字 这个关键字的用途就是去除重复的纪录 如没有添加这个关键字的时候 视图查询出来的纪录有 条 添加了这个关键字后 数据库就会剔除重复的纪录 只显示不重复的 条纪录 此时 若用户要改变其中一个数据 则数据库就不知道其到底需要更改哪条纪录 因为视图中看起来只有一条纪录 而在基础表中可能对有的纪录有几十条 为此 若在视图中采用了Distinct关键字的话 就无法对视图中的内容进行更改
如果在视图中有AVG MAX等函数 则也不能够对其进行更新 如在一张视图中 其采用了SUN函数来汇总员工的工资时 此时 就不能够对这张表进行更新 这是数据库为了保障数据一致性所添加的限制条件
可见 试图虽然方便 安全 但是 其仍然不能够代替表的地位 当需要对一些表中的数据进行更新时 我们往往更多的通过对表的 *** 作来完成 因为对视图内容进行直接更改的话 需要遵守一些限制条件 在实际工作中 更多的处理规则是通过前台程序直接更改后台基础表 至于这些表中数据的安全性 则要依靠前台应用程序来保护 确保更改的准确性 合法性
限制条件二 定义视图的查询语句中不能够使用某些关键字
我们都知道 视图其实就是一组查询语句组成 或者说 视图是封装查询语句的一个工具 在查询语句中 我们可以通过一些关键字来格式化显示的结果 如我们在平时工作中 经常会需要把某张表中的数据跟另外一张表进行合并 此时 数据库管理员就可以利用Select Into语句来完成 先把数据从某个表中查询出来 然后再添加到某个表中
当经常需要类似的 *** 作时 我们是否可以把它制作成一张视图 每次有需要的时候 只需要运行这个视图即可 而不用每次都进行重新书写SQL代码 不过可惜的是 结果是否定的 在SQL Server数据库的视图中 是不能够带有Into关键字 如果要实现类似的功能 只有通过函数或者过程来实现
另外 跟Oracle数据库不同的是 在微软的SQLServer数据库中创建视图的时候 还有一个额外的限制 就是不能够在创建视图的查询语句中 使用order by排序语句 这是一个很特殊的规定 一些Oracle的数据库管理员 在使用SQL Server数据库创建视图的时候 经常会犯类似的错误 他们就搞不明白 为什么Oracle数据库中可行 但是在微软的数据库中则行不通呢这恐怕只有微软数据库产品的设计者才能够回答的问题 总之我们要记住的就是 在SQLServer数据库中 建立视图时 查询语句中不能够包含Order By语句
限制条件三 要对某些列取别名 并保证列名的唯一
在表关联查询的时候 当不同表的列名相同时 只需要加上表的前缀即可 不需要对列另外进行命名 但是 在创建视图时就会出现问题 数据库会提示 duplicate column name 的错误提示 警告用户有重复的列名 有时候 用户利用Select语句连接多个来自不同表的列 若拥有相同的名字 则这个语句仍然可以执行 但是 若把它复制到创建视图的窗口 创建视图时 就会不成功
查询语句跟创建视图的查询语句还有很多类似的差异 如有时候 我们在查询语句中 可能会比较频繁的采用一些算术表达式;或者在查询语句中使用函数等等 在查询的时候 我们可以不给这个列 取名 数据库在查询的时候 会自动给其命名 但是 在创建视图时 数据库系统就会给你出难题 系统会提醒你为列取别名
从以上两个例子中 我们可以看出 虽然视图是对SQL语句的封装 但是 两者仍然有差异 创建视图的查询语句必须要遵守一定的限制 如要保证视图的各个列名的唯一;如果自阿视图中某一列是一个算术表达式 函数或者常数的时候 要给其取名字 等等
限制条件四 权限上的双重限制
为了保障基础表数据的安全性 在视图创建的时候 其权限控制比较严格
一方面 若用户需要创建视图 则必须要有数据库视图创建的权限 这是视图建立时必须遵循的一个基本条件 如有些数据库管理员虽然具有表的创建 修改权限;但是 这并不表示这个数据库管理员就有建立视图的权限 恰恰相反 在大型数据库设计中 往往会对数据库管理员进行分工 建立基础表的就只管建立基础表;负责创建视图的就只有创建视图的权限
其次 在具有创建视图权限的同时 用户还必须具有访问对应表的权限 如某个数据库管理员 已经有了创建视图的权限 此时 若其需要创建一张员工工资信息的视图 还不一定会成功 这还要这个数据库管理员有美誉跟工资信息相关的基础表的访问权限 如建立员工工资信息这张视图一共涉及到五张表 则这个数据库管理员就需要拥有者每张表的查询权限 若没有的话 则建立这张视图就会以失败告终
第三 就是视图权限的继承问题 如上面的例子中 这个数据库管理员不是基础表的所有者 但是经过所有者的授权 他就可以对这个基础表进行访问 就可以以此为基础建立视图 但是 这个数据库管理员有没有把对这个基础表的访问权限再授权给其他人呢如他能否授权给A用户访问员工考勤信息表呢答案是不一定 默认情况下 数据库管理员不能够再对其他用户进行授权 但是 若基础表的所有者 把这个权利给了数据库管理员之后 则他就可以对用户进行重新授权 让数据库管理员可以给A用户进行授权 让其可以进行相关的 *** 作
lishixinzhi/Article/program/SQLServer/201311/22451
--通过如下语句得到当前Sql server中所有的数据的名称:
use master
select [name] from [sysdatabases] order by [name]
go
-- 查询数据库中的所有用户表
use [DBname]
select [id], [name] from [sysobjects] where [type] = 'u' order by [name]
--通过上面的查询的id,可以查出这个表中所有的字段,例如我们查询BaseData表中所有的字段,就可以通过下面的语句查出:
select [name] from [syscolumns] where [id] = 2087000699 order by [colid]
go
你所说的问题的语句是:
select [name], from [syscolumns] order by [id]
--定义变量
DECLARE @query varchar(max),
@tableName varchar(max),
@columnName varchar(max)
--设置表名
SET @tableName = 'Employee'
--获取指定表名的第一列的名称
SELECT TOP 1 @columnName = cname
FROM sysall_columns c JOIN sysall_objects o
ON cobject_id = oobject_id
WHERE oname = @tableName
--构造查询语句
SET @query = 'SELECT ' + @columnName + ' FROM ' + @tableName
--执行查询语句
EXECUTE (@query)
直接在SQL中是没法这么个结构出来的,需要配合编程语言实现
1、先查询出用户列表,然后循环用户列表,再根据用户跟作品表的关联查询到每个用户的作品信息
2、分别查询出用户表和作品表中的所有数据,再根据用户和作品的关联字段进行数据的组合
select DATENAME(yyyy, date) + '-' + DATENAME(mm, date) AS month,usercode, avg(score) as avgScore ,row_number() over(order by avg(score) desc) 名次 from tScore group by DATENAME(yyyy, date) + '-' + DATENAME(mm, date),usercode
你好,可以用row_number()
以上就是关于sql server,更改列名怎么写如列A改名为列B全部的内容,包括:sql server,更改列名怎么写如列A改名为列B、SQL Server视图管理中的四个限制条件、在sqlserver2000中怎么查表的列名并按在表中的顺序显示等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)