sqlserver语句大全 列转行查询语句

用SQL语句建表时如何给字段添加说明?-MS-SQLServer/应用实例-mssql-电脑编程网用SQL语句建表时如何给字段添加说明?-MS-SQLServer/应用实例作者:zaocha321 和相关&&
在用SQL语句 create table 建表时如何给字段添加说明啊?在用设计器中建表时可以为每个字段添加说明,我想用SQL语句也应该可以吧。在网上找的方法都没法实现。。。。------回答---------------其他回答(20分)---------
SQL code
/*
在SQL语句中通过系统存储过sp_addextendedproperty可为表字段添加上动态的说明(备注)下面是SQL SERVER帮助文档中对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' }
]
参数
[ @name = ] { 'property_name' }
要添加的属性名称。property_name 的数据类型为 sysname,它不能是 NULL。名称可能还包括空白或非字母数字字符串和二进制值。
[ @value = ] { 'value' }
将要与属性相关联的值。value 的数据类型为 sql_variant,带有默认设置 NULL。value 的大小不能超过 7,500 字节;否则 SQL Server 会产生错误。
[ @level0type = ] { 'level0_object_type' }
用户或用户定义类型。level0_object_type 的数据类型为 varchar(128),其默认值为 NULL。有效的输入是 USER、TYPE 和 NULL。
[ @level0name = ] { 'level0_object_name' }
指定的 0 级对象类型的名称。level0_object_name 的数据类型为 sysname,其默认值为 NULL。
[ @level1type = ] { 'level1_object_type' }
1 级对象的类型。level1_object_type 的数据类型为 varchar(128),其默认值为 NULL。有效的输入是 TABLE、VIEW、PROCEDURE、FUNCTION、DEFAULT、RULE 和 NULL。
[ @level1name = ] { 'level1_object_name' }
指定的 1 级对象类型的名称。level1_object_name 的数据类型为 sysname,其默认值为 NULL。
[ @level2type = ] { 'level2_object_type' }
2 级对象的类型。level2_object_type 的数据类型为 varchar(128),其默认值为 NULL。有效的输入是 COLUMN、PARAMETER、INDEX、CONSTRAINT、TRIGGER 和 NULL。
[ @level2name = ] { 'level2_object_name' }
指定的 2 级对象类型的名称。level2_object_name 的数据类型为 sysname,其默认值为 NULL。
返回代码值
0(成功)或 1(失败)
注释
系统对象不允许有扩展属性。
对象是按级别区分的,0 级为最高,2 级为最低。当用户添加、更新或删除扩展属性时,必须指定所有更高级别的对象。例如,如果用户要向 1 级对象添加扩展属性,就必须指定所有 0 级信息。如果用户要向 2 级对象添加扩展属性,则必须提供关于 0 级和 1 级的所有信息。
在每个级别上,对象类型和对象名可唯一地标识对象。如果指定了一个对中的任一方,则必须指定另一方。
给定了有效 property_name 和 value,如果没有任何对象类型和名称,则属性属于当前。如果指定对象类型和名称,则还必须指定父对象和类型。否则,SQL Server 会产生错误。
权限
db_owner 和 db_ddladmin 固定角色的成员可以将扩展属性添加到任何对象中。用户可以为他们所拥有的对象添加扩展属性。然而,只有 db_owner 可以将属性添加到用户名称中。
下面是我在使用过程中对表ClipInfo的字段通过sp_addextendedproperty存储过程加的说明,
ALTER TABLE [dbo].[ClipInfo] ADD CONSTRAINT [PK_CLIPINFO] PRIMARY KEY CLUSTERED ([ClipNum])
GO
sp_addextendedproperty N'MS_Description', N'卡号', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'ClipNum'
GO
sp_addextendedproperty N'MS_Description', N'密码', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'Passd'
GO
sp_addextendedproperty N'MS_Description', N'所属地', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'ClipArea'
GO
sp_addextendedproperty N'MS_Description', N'创建时间', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'CreateTime'
GO
sp_addextendedproperty N'MS_Description', N'修改时间', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'UpdateTime'
GO
sp_addextendedproperty N'MS_Description', N'状态', 'USER', N'dbo', 'TABLE', N'ClipInfo', 'COLUMN', N'ClipState'
GO
select * from sys.extended_properties a
where a.major_id=object_id('ta')
select * from sys.extended_properties
select * from syscolumns where id=object_id('ta')
列出表&t&中所有列的所有扩展属性:
SELECT
::fn_listextendedproperty(NULL,'user','dbo','table','ta','column',default)
列出表&t&中列col1的描述属性:
SELECT
value
FROM
::fn_listextendedproperty('MS_Description','user','dbo','table','ta','column','id')
添加表&t&中列col1的描述属性:
EXEC
sp_addextendedproperty
'MS_Description','列1','user',dbo,'table','t','column',col1
删除表&t&中列col1的描述属性:
EXEC
sp_dropextendedproperty
'MS_Description','user',dbo,'table','t','column',col1
更新表&t&中列col1的描述属性:
EXEC
sp_updateextendedproperty
'MS_Description','字段1','user',dbo,'table','t','column',col1
--表及字段描述信息处理示例
--创建表
create table 表(a1 varchar(10),a2 char(2))
--为表添加描述信息
EXECUTE sp_addextendedproperty N'MS_Description', '人员信息表', N'user', N'dbo', N'table', N'表', NULL, NULL
--为字段a1添加描述信息
EXECUTE sp_addextendedproperty N'MS_Description', '姓名', N'user', N'dbo', N'table', N'表', N'column', N'a1'
--为字段a2添加描述信息
EXECUTE sp_addextendedproperty N'MS_Description', '性别', N'user', N'dbo', N'table', N'表', N'column', N'a2'
--更新表中列a1的描述属性:
EXEC sp_updateextendedproperty 'MS_Description','字段1','user',dbo,'table','表','column',a1
--删除表中列a1的描述属性:
EXEC sp_dropextendedproperty 'MS_Description','user',dbo,'table','表','column',a1
--删除测试
drop table 表
------其他回答(20分)---------
如SQL code
-- T_WORKINFO_TEMPLATE 工作信息模板
IF OBJECT_ID('T_WORKINFO_TEMPLATE') IS NOT NULL DROP TABLE T_WORKINFO_TEMPLATE
GO
CREATE TABLE T_WORKINFO_TEMPLATE
(
WORKINFO_TEMPLATE_ID CHAR(36) PRIMARY KEY,
-- 主键
COMPONENTREFERENCE VARCHAR(400),
-- 相关设备
ITEMNAME VARCHAR(200),
ITEMCONTENT VARCHAR(2000),
-- 保养内容
PERIOD NUMERIC(9,2),
-- 预检周期
PERIODICAL VARCHAR(10),
-- 周期的单位,数据取T_PERIODICAL
REMARK VARCHAR(4000),
-- 备注
CLASS VARCHAR(20)
-- 类别
) ON [PRIMARY]
GO
exec sp_addextendedproperty N'MS_Description', N'主键', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'WORKINFO_TEMPLATE_ID'
exec sp_addextendedproperty N'MS_Description', N'相关设备', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'COMPONENTREFERENCE'
exec sp_addextendedproperty N'MS_Description', N'保养项目', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'ITEMNAME'
exec sp_addextendedproperty N'MS_Description', N'保养内容', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'ITEMCONTENT'
exec sp_addextendedproperty N'MS_Description', N'预检周期', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'PERIOD'
exec sp_addextendedproperty N'MS_Description', N'周期的单位,数据取T_PERIODICAL', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'PERIODICAL'
exec sp_addextendedproperty N'MS_Description', N'备注', N'user', N'dbo', N'table', N'T_WORKINFO_TEMPLATE', N'column', N'REMARK'
GO
相关资料:|||||||用SQL语句建表时如何给字段添加说明?-MS-SQLServer/应用实例来源网络,如有侵权请告知,即处理!编程Tags:                &                    求动态SQl语句列转行和双表头
[问题点数:40分,结帖人ap0405140]
求动态SQl语句列转行和双表头
[问题点数:40分,结帖人ap0405140]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关推荐:
2013年 总版技术专家分年内排行榜第二
2014年8月 总版技术专家分月排行榜第一2014年7月 总版技术专家分月排行榜第一2014年6月 总版技术专家分月排行榜第一2014年5月 总版技术专家分月排行榜第一2014年4月 总版技术专家分月排行榜第一2014年3月 总版技术专家分月排行榜第一2014年1月 总版技术专家分月排行榜第一2013年12月 总版技术专家分月排行榜第一
匿名用户不能发表回复!|
每天回帖即可获得10分可用分!小技巧:
你还可以输入10000个字符
(Ctrl+Enter)
请遵守CSDN,不得违反国家法律法规。
转载文章请注明出自“CSDN(www.csdn.net)”。如是商业用途请联系原作者。SQL Server 2005之PIVOT/UNPIVOT行列转换(行转列、列转行) - CSDN博客
SQL Server2005引入了很多迎合开发者口味的新特性,虽然改动不大,却大大了减少了开发者的工作量,这种替用户考虑的开发思路,值得称赞。
在SQL Server2000中,要实现行列转换,需要综合利用聚合函数和动态SQL,实现起来需要一定的技巧,所以在CSDN的SQL讨论区里可以看到大量询问行列转换如何实现的问题。到了2005中,使用新引进的关键字PIVOT/UNPIVOT,可以轻松实现行列转换的需求。
好像Oracle11g也准备引入PIVOT/UNPIVOT特性,对于Oracle开发来说,It's a good news。
本文通过两个简单的例子展示PIVOT/UNPIVOT的用法。详细的语法请参考联机帮助。
PIVOT(列转行)
创建测试表,插入测试数据
create table test(id int,name varchar(20),quarter int,profile int)&
insert into test values(1,'a',1,1000)
insert into test values(1,'a',2,2000)
insert into test values(1,'a',3,4000)
insert into test values(1,'a',4,5000)
insert into test values(2,'b',1,3000)
insert into test values(2,'b',2,3500)
insert into test values(2,'b',3,4200)
insert into test values(2,'b',4,5500)
select * from test
id name quarter profile
------------------------
1 & &a & & 1 & & 1000
1 & &a & & 2 & & 2000
1 & &a & & 3 & & 4000
1 & &a & & 4 & & 5000
2 & &b & & 1 & & 3000
2 & &b & & 2 & & 3500
2 & &b & & 3 & & 4200
2 & &b & & 4 & & 5500
(8 row(s) affected)
利用PIVOT将个季度的利润转成横向显示:
select id,name,
[1] as &一季度&,
[2] as &二季度&,
[3] as &三季度&,
[4] as &四季度&
sum(profile)
for quarter in
([1],[2],[3],[4])
id name 一季度 二季度 三季度 四季度
-------------------------------------------
1 & &a & &
2 & &b & &
(2 row(s) affected)
UNPIVOT(行转列)
建立测试表,插入测试数据
drop table test
create table test(id int,name varchar(20), Q1 int, Q2 int, Q3 int, Q4 int)
insert into test values(1,'a',00,5000)
insert into test values(2,'b',00,5500)
select * from test
id name &Q1 & &Q2 & &Q3 & &Q4
--------------------------------
(2 row(s) affected)
利用UNPIVOT,将同一行中四个季度的列数据转换成四行数据:
select id,name,quarter,profile
for quarter in
([Q1],[Q2],[Q3],[Q4])
id name quarter profile
------------------------
1 & a & & Q1 & & 1000
1 & a & & Q2 & & 2000
1 & a & & Q3 & & 4000
1 & a & & Q4 & & 5000
2 & b & & Q1 & & 3000
2 & b & & Q2 & & 3500
2 & b & & Q3 & & 4200
2 & b & & Q4 & & 5500
(8 row(s) affected)您的位置: >
SQL中PIVOT 行列转换
学习标签:
本文导读:T-SQL语句中,Pivot运算符用于在列和行之间对数据进行旋转或透视转换,PIVOT命令可以实现数据表的列转行,同时执行聚合运算,UNPIVOT则与其相反,实现数据的行转列。
PIVOT通过将表达式某一列中的唯一值转换为输出中的多个列来旋转表值表达式,并在必要时对最终输出中所需的任何其余列值执行聚合。UNPIVOT与PIVOT执行相反的操作,将表值表达式的列转换为列值。
通俗简单的说:PIVOT就是行转列,UNPIVOT就是列传行
一、PIVOT实例
建立一个销售情况表,其中,year字段表示年份,quarter字段表示季度,amount字段表示销售额。quarter字段分别用Q1, Q2, Q3, Q4表示一、二、三、四季度。
SQL 代码 &&复制
CREATE TABLE SalesByQuarter
quarter CHAR(2),
amount MONEY
2. 填入表数据
使用如下程序填入表数据。
SQL 代码 &&复制
SET NOCOUNT ON
DECLARE @index INT
DECLARE @q INT
SET @index = 0
DECLARE @year INT
while (@index & 30)
SET @year = 2005 + (@index % 4)
SET @q = (CAST((RAND() * 500) AS INT) % 4) + 1
INSERT INTO SalesByQuarter VALUES (@year, 'Q' + CAST(@q AS CHAR(1)), RAND() * 10000.00)
SET @index = @index + 1
3、如果我们要比较每年中各季度的销售状况,要怎么办呢?有以下两种方法:
(1)、使用传统Select的CASE语句查询
在SQL Server以前的版本里,将行级数据转换为列级数据就要用到一系列CASE语句和聚合查询。虽然这种方式让开发人员具有了对所返回数据进行高度控制的能力,但是编写出这些查询是一件很麻烦的事情。
SQL 代码 &&复制
SELECT year as 年份
, sum (case when quarter = 'Q1' then amount else 0 end) 一季度
, sum (case when quarter = 'Q2' then amount else 0 end) 二季度
, sum (case when quarter = 'Q3' then amount else 0 end) 三季度
, sum (case when quarter = 'Q4' then amount else 0 end) 四季度
FROM SalesByQuarter GROUP BY year ORDER BY year DESC
得到的结果如下:
(2)、使用PIVOT
由于SQL Server 2005有了新的PIVOT运算符,就不再需要CASE语句和GROUP BY语句了。(每个PIVOT查询都涉及某种类型的聚合,因此你可以忽略GROUP BY语句。)PIVOT运算符让我们能够利用CASE语句查询实现相同的功能,但是你可以用更少的代码就实现,而且看起来更漂亮。
SQL 代码 &&复制
SELECT year as 年份, Q1 as 一季度, Q2 as 二季度, Q3 as 三季度, Q4 as 四季度 FROM SalesByQuarter PIVOT (SUM (amount) FOR quarter IN (Q1, Q2, Q3, Q4) ) AS P ORDER BY YEAR DESC
得到的结果如下:
二、通过下面一个实例详细介绍PIVOT的过程
SQL 代码 &&复制
SELECT [星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日]--这里是PIVOT第三步(选择行转列后的结果集的列)这里可以用&*&表示选择所有列,也可以只选择某些列(也就是某些天)
FROM WEEK_INCOME --这里是PIVOT第二步骤(准备原始的查询结果,因为PIVOT是对一个原始的查询结果集进行转换操作,所以先查询一个结果集出来)这里可以是一个select子查询,但为子查询时候要指定别名,否则语法错误
SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])--这里是PIVOT第一步骤,也是核心的地方,进行行转列操作。聚合函数SUM表示你需要怎样处理转换后的列的值,是总和(sum),还是平均(avg)还是min,max等等。例如如果week_income表中有两条数据并且其week都是&星期一&,其中一条的income是1000,另一条income是500,那么在这里使用sum,行转列后&星期一&这个列的值当然是1500了。后面的for [week] in([星期一],[星期二]...)中 for [week]就是说将week列的值分别转换成一个个列,也就是&以值变列&。但是需要转换成列的值有可能有很多,我们只想取其中几个值转换成列,那么怎样取呢?就是在in里面了,比如我此刻只想看工作日的收入,在in里面就只写&星期一&至&星期五&(注意,in里面是原来week列的值,&以值变列&)。总的来说,SUM(INCOME) for [week] in([星期一],[星期二],[星期三],[星期四],[星期五],[星期六],[星期日])这句的意思如果直译出来,就是说:将列[week]值为&星期一&,&星期二&,&星期三&,&星期四&,&星期五&,&星期六&,&星期日&分别转换成列,这些列的值取income的总和。
)TBL--别名一定要写
三.UNPIVOT
很明显,UN这个前缀表明了,它做的操作是跟PIVOT相反的,即列转行。UNPIVOT操作涉及到以下三个逻辑处理阶段。
1,生成副本
2,提取元素
3,删除带有NULL的行
UNPIVOT实例
SQL 代码 &&复制
CREATE TABLE pvt (VendorID int, Emp1 int, Emp2 int,
Emp3 int, Emp4 int, Emp5 int);
INSERT INTO pvt VALUES (1,4,3,5,4,4);
INSERT INTO pvt VALUES (2,4,1,5,5,5);
INSERT INTO pvt VALUES (3,4,3,5,4,4);
INSERT INTO pvt VALUES (4,4,2,5,5,4);
INSERT INTO pvt VALUES (5,5,1,5,5,5);
--Unpivot the table.
SELECT VendorID, Employee, Orders
(SELECT VendorID, Emp1, Emp2, Emp3, Emp4, Emp5
FROM pvt) p
(Orders FOR Employee IN
(Emp1, Emp2, Emp3, Emp4, Emp5)
上面UNPIVOT实例的分析
UNPIVOT的输入是左表表达式P,第一步,先为P中的行生成多个副本,在UNPIVOT中出现的每一列,都会生成一个副本。因为这里的IN子句有5个列名称,所以要为每个来源行生成5个副本。结果得到的虚拟表中将新增一个列,用来以字符串格式保存来源列的名称(for和IN之间的,上面例子是 Employee )。第二步,根据新增的那一列中的值从来源列中提取出与列名对应的行。第三步,删除掉结果列值为null的行,完成这个查询。
您可能感兴趣
一月好评排行榜}

我要回帖

更多关于 sqlserver 查询列名 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信