免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: asuntea
打印 上一主题 下一主题

如何使用SQL语句实现在指定列前后增加列!急 [复制链接]

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
11 [报告]
发表于 2010-08-18 13:03 |只看该作者
估计是他们的开发人员懒得一个个写字段名,动辄想select *这样弄出来的问题。
这可是开发程序的不良习惯之一啊。

论坛徽章:
0
12 [报告]
发表于 2010-08-18 14:00 |只看该作者
本帖最后由 asuntea 于 2010-08-18 15:10 编辑

想忽悠,但是他们自己会查数据库的,很难缠的客户

论坛徽章:
0
13 [报告]
发表于 2010-08-18 16:07 |只看该作者
哎,难道他们不接受视图么,不成把视图命名的和表一样,政府的就是麻烦

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
14 [报告]
发表于 2010-08-24 13:00 |只看该作者
已经找到调整列的顺序的方法了。


下面是测试例子:
先建立一个新的测试表test
1> drop table test
2> go
1> create table test(id int not null,name varchar(30) null,age tinyint not null,
se_x char(1) not null,birthday datetime null)
2> go
1> select *  from test
2> go
id          name                           age se_x birthday
----------- ------------------------------ --- --- --------------------------

(0 rows affected)

插入一条测试数据

1> insert into test
2> values(1,'andkylee',28,'F','1982-03-20 12:00:00')
3> go
(1 row affected)
1> select *  from test
2> go
id          name                           age se_x birthday
----------- ------------------------------ --- --- --------------------------
           1 andkylee                        28 F          Mar 20 1982 12:00PM
(1 row affected)

调整各个的顺序,使之倒序。将原来的id,name,age,se_x,birthday改成:birthday,se_x,age,name,id
调整方法:修改syscolumns表中测试表test的各个列的colid的顺序。

1> select *  from test
2> go
birthday                   se_x age name                           id
-------------------------- --- --- ------------------------------ -----------
        Mar 20 1982 12:00PM F    28 andkylee                                 1

(1 row affected)

列的顺序逆序后,显示插入数据。

1> insert into test(id,name,age,se_x,birthday)
2> values(2,'liu',30,'M','2000-01-01 11:59:59')
3> go
(1 row affected)
1> select * from test
2> go
birthday                   se_x age name                           id
-------------------------- --- --- ------------------------------ -----------
        Mar 20 1982 12:00PM F    28 andkylee                                 1
        Jan  1 2000 11:59AM M    30 liu                                      2

(2 rows affected)

如果按照调整数据之前的列的顺序插入数据,则会报错。
1> insert into test
2> values(3,'zhang',29,'F','1980-01-01 11:59:59')
3> go
Msg 206, Level 16, State 2:
Server 'SYB_NFJD_TEST', Line 1:
Operand type clash: INT is incompatible with DATETIME
Msg 257, Level 16, State 1:
Server 'SYB_NFJD_TEST', Line 1:
Implicit conversion from datatype 'VARCHAR' to 'INT' is not allowed.  Use the
CONVERT function to run this query.

新的数据要按照修改后的列的顺序插入。
1> insert into test
2> values('1980-01-01 11:59:59','F',29,'zhang',3)
3> go
(1 row affected)

最后,查看测试表的数据。
1> select * from test
2> go
birthday                   se_x age name                           id
-------------------------- --- --- ------------------------------ -----------
        Mar 20 1982 12:00PM F    28 andkylee                                 1
        Jan  1 2000 11:59AM M    30 liu                                      2
        Jan  1 1980 11:59AM F    29 zhang                                    3

(3 rows affected)

备注:绝大多数sybase客户端工具显示表的列时都是按照colid的顺序显示的。所以,此法顶能实现你的要求。

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
15 [报告]
发表于 2010-08-24 13:01 |只看该作者
原来的测试表test中有一列:s*e*x,
提交的时候提示:对不起,您填写的内容(如签名、帖子、短消息等)包含不良内容而无法提交,请修改。

改成:se_x

论坛徽章:
0
16 [报告]
发表于 2010-08-24 17:38 |只看该作者
列在什么位置根本不重要!显示时可以控制

论坛徽章:
34
ChinaUnix元老
日期:2018-07-04 15:10:362015年亚洲杯之阿联酋
日期:2015-02-06 17:15:532015亚冠之武里南联
日期:2015-06-06 15:40:252015亚冠之北京国安
日期:2015-06-17 15:42:412022北京冬奥会纪念版徽章
日期:2015-08-10 16:30:322015亚冠之阿尔纳斯尔
日期:2015-09-20 09:42:1215-16赛季CBA联赛之北京
日期:2016-01-15 10:03:5915-16赛季CBA联赛之青岛
日期:2016-04-26 16:44:4915-16赛季CBA联赛之广夏
日期:2018-07-04 15:33:21C
日期:2016-10-25 16:12:142017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之同曦
日期:2017-02-22 22:41:10
17 [报告]
发表于 2010-08-24 19:26 |只看该作者
回复 15# andkylee


   

论坛徽章:
6
水瓶座
日期:2014-06-04 03:34:37水瓶座
日期:2014-06-17 13:20:31数据库技术版块每日发帖之星
日期:2016-07-09 06:20:00数据库技术版块每日发帖之星
日期:2016-07-17 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
18 [报告]
发表于 2010-08-24 19:54 |只看该作者
回复 16# crocodile_linux


    select *  的时候能控制?

论坛徽章:
0
19 [报告]
发表于 2010-08-25 09:37 |只看该作者
用一个变通的办法
sp_rename old_table,new_table
go
create view old_table as
select col1,... coln from new_table
go

注意view old_table的列顺序,需要你按照你的顺序显示的写出。

论坛徽章:
7
数据库技术版块每日发帖之星
日期:2015-08-09 06:20:00数据库技术版块每日发帖之星
日期:2015-11-03 06:20:00数据库技术版块每日发帖之星
日期:2016-02-20 06:20:00数据库技术版块每日发帖之星
日期:2016-07-13 06:20:00数据库技术版块每日发帖之星
日期:2016-07-31 06:20:00数据库技术版块每日发帖之星
日期:2016-08-01 06:20:00数据库技术版块每日发帖之星
日期:2016-08-18 06:20:00
20 [报告]
发表于 2010-08-25 09:52 |只看该作者
sp_rename可以改名,但是其object_id不会变,所以已经导入的引用改表的过程里可不会依照名字指向新表,为此还得把原来的老表里面sp_depends的那些过程,触发器还得重导一次。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP