柔情似水 发表于 2015-1-16 14:09:00

怎样使用SQL创立与修正列的申明信息(备注信息)详解

线上或者测试环境经常出现的误操作总是让DBA同学那么闹心。信任良多伴侣对使用SQL创立表已很熟习了,但我们发明在创立表的同时不克不及像增加默许值大概主键一样为列加上申明信息,以是我们常常是创立表后再到表的可视化计划器中为列加上申明,如许操纵起来就相称贫苦了,本篇我们次要会商怎样使用SQL在创立表时为列加上申明信息。

我们先创立一个测试表:
ifexists(select1fromsys.tableswhereobject_id=object_id(test))
begin
droptabletest
end
createtabletest
(
col1varchar(50),
col2varchar(50)
)

这个我们已很熟习了,那末怎样为列col1及col2加上申明信息呢?
这就要用到体系存储历程sp_addextendedproperty。
在增加之前我们先看一下sp_addextendedproperty的语法:
sp_addextendedproperty
[@name=]{property_name}
[,[@value=]{value}
[,[@level0type=]{level0_object_type}
,[@level0name=]{level0_object_name}
[,[@level1type=]{level1_object_type}
,[@level1name=]{level1_object_name}
[,[@level2type=]{level2_object_type}
,[@level2name=]{level2_object_name}
]
]
]
]

该存储历程一共有8个参数,估量初学者一看就晕了,不要发急,我们能够经由过程实例来了解,上面我们先使用sp_addextendedproperty为col1列加上申明:
executesp_addextendedpropertyNMS_Description,N这是测试列1,NSCHEMA,Ndbo,Ntable,Ntest,Ncolumn,Ncol1

下面就是为列col1加上申明的SQL命令,来了解一下:
固然sp_addextendedproperty有8个参数,但我们能够把这个8个参数了解为4对,实在看参数名我们也能够猜出也许了:
@name与@value为一对
@level0type与@level0name为一对
@level1type与@level1name为一对
@level2type与@level2name为一对

那末这4对参数分离代表甚么呢?
1,@name与@value
@name:指定我们是要为列增加甚么信息,好比我们要为列增加扩大信息,那末@name就即是Caption,本篇是要为列增加申明信息,以是@name即是MS_Description
@value:指定与@name联系关系的值,本篇也就是列的详细申明。

2,@level0type与@level0name
@level0type:指定我们要修正的列的表所于谁人数据库架构,以是它即是SCHEMA,有些网上教程中会说它也能够即是user,但在sqlserver的将来版本中,将删除user,以是保举人人用SCHEMA
@level0name:指定我们要修正的表地点架构的称号

3,@level1type与@level1name
@level1type:指明我们要修正的列所属工具是表,仍是视图等。本篇是修正表中的列,以是为table,
@@level1name:指明要修正的列所属表的称号

4,@level2type与@level2name
@level2type:指明我们要修正的工具是列,仍是主键,仍是束缚等。本篇修正的是列,以是为column
@level2name:指明要修正列的列名

到此,我们应当懂得sp_addextendedproperty中各参数的意义了,完全的SQL命令以下:
ifexists(select1fromsys.tableswhereobject_id=object_id(test))
begin
droptabletest
end
createtabletest
(
col1varchar(50),
col2varchar(50)
)

executesp_addextendedpropertyNMS_Description,N这是测试列1,NSCHEMA,Ndbo,Ntable,Ntest,Ncolumn,Ncol1

executesp_addextendedpropertyNMS_Description,N这是测试列2,NSCHEMA,Ndbo,Ntable,Ntest,Ncolumn,Ncol2


实行命令后经由过程以下查询语句来考证我们的了局:
selectB.Name,A.valuefromsys.extended_propertiesA
innerjoinsys.columnsBonA.major_id=B.object_id
andA.minor_id=B.column_id
whereA.major_id=object_id(test)

关于怎样使用SQL语句查询指定表的列申明信息,请参看本站:
使用SQL语句查询出指定表的一切扩大属性(列申明)

实行,前往的了局以下:
Namevalue
col1这是测试列1
col2这是测试列2

创立表时同时为表中的列增加申明信息我们已完成了,那末,我们要怎样使用SQL来修正列的申明信息呢?使用体系存储历程sp_updateextendedproperty,它的用法和sp_addextendedproperty一样,就未几加申明了,修正示比方下:
executesp_updateextendedpropertyNMS_Description,N这是修正后的测试列1,NSCHEMA,Ndbo,Ntable,Ntest,Ncolumn,Ncol1

executesp_updateextendedpropertyNMS_Description,N这是修正后的测试列2,NSCHEMA,Ndbo,Ntable,Ntest,Ncolumn,Ncol2

一样使用下面的SQL语句查询修正后的了局:
Namevalue
col1这是修正后的测试列1
col2这是修正后的测试列2

本篇到此停止,但愿本篇能给人人带来一些匡助。MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。

分手快乐 发表于 2015-1-18 12:11:32

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

冷月葬花魂 发表于 2015-1-26 16:06:26

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

因胸联盟 发表于 2015-2-4 20:42:23

可以动态传入参数,省却了动态SQL的拼写。

小妖女 发表于 2015-2-10 09:29:36

而写到本地,我又考虑到效率问题.大家来讨论讨论吧,分数不打紧,就给10分,十全十美,没啥对错,各抒己见,但是要有说服力的哦~

金色的骷髅 发表于 2015-3-1 09:33:24

一直以来个人感觉SQLServer的优化器要比Oracle的聪明。SQL2005的更是比2k聪明了不少。(有次作试验发现有的语句在200万级时还比50万级的相同语句要快show_text的一些提示没有找到解释。一直在奇怪。)

admin 发表于 2015-3-10 16:40:05

对于微软系列的东西除了一遍遍尝试还真没有太好的办法

灵魂腐蚀 发表于 2015-3-17 09:10:16

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

不帅 发表于 2015-3-24 05:23:03

不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
页: [1]
查看完整版本: 怎样使用SQL创立与修正列的申明信息(备注信息)详解