富有挑战性的问题
现在有一张表为A,其有两列名x和y,我如何用其中的一个列名y的记录来当作列名重新建一张表B,也就是动态的创建一张表,请问该如何实现,是否要用到游标???(急急急!!!) 问题点数:20、回复次数:18Top
1 楼smartdonkey(聪明的毛驴)回复于 2001-09-16 16:44:55 得分 0
--是的用游标,如下
declare @s varchar(1024)
declare @fld_name varchar(40)
declare mycursor cursor for select y from A
open mycursor
fetch mycursor into @fld_name
--假设y字段包括字段名字和字段的类型(如:"col1 char(20)")
while @@fetch_status=0
begin
set @s=@s+@fld_name+','
fetch mycursor into @fld_name
end
set @s='create table mytable('+substring(@s,1,len(@s)-1)+')'
execute(@s)
Top
2 楼lanying(蓝鹰)(问个不休)回复于 2001-09-16 16:57:58 得分 0
“毛驴“果然聪明呀
Top
3 楼snaker2001()回复于 2001-09-16 17:38:37 得分 0
这样不行啊,你的“假设y字段包括字段名字和字段的类型(如:"col1 char(20)")”是什么意思,我在SQL语句中怎么写啊???请指点!
Top
4 楼snowglave(独孤九剑)回复于 2001-09-16 20:39:53 得分 0
这个问题我做过,好像Fox系列可以这样做,但SQL不用游标的话比较难实现,我用的是Delphi语句代换SQL语名循环实现的,方法比较笨,也期待有一种更好的方法。Top
5 楼hxflx(踪之声)回复于 2001-09-16 21:23:35 得分 0
col1 char(20) 指在y字段所指的记录中包括:字段名 字段类型 字段长度
col1 char 20
要求你把 new表的结构写入到 y 字段中.
sql:
create table mytable( substring("col1 char(20),",1,len("col1 char(20),")-1)
//create table mytable('+substring(@s,1,len(@s)-1)+')' up
smartdonkey,right?Top
6 楼snaker2001()回复于 2001-09-16 21:37:31 得分 0
我还是不明白,在“declare mycursor cursor for select y from A”中,y只是一个字段名,怎么会有“假设y字段包括字段名字和字段的类型(如:"col1 char(20)")”呢,我怎么加入呢,因为我知道后面的@s中要用到数据类型,请指点。Top
7 楼snaker2001()回复于 2001-09-17 09:13:14 得分 0
高手上哪去了呢?怎么没人再回答呢?Top
8 楼smartdonkey(聪明的毛驴)回复于 2001-09-17 09:37:54 得分 0
你的y字段存的什么数据,可以给出真实数据库例子吗?
Top
9 楼snaker2001()回复于 2001-09-17 09:43:28 得分 0
y字段名是equip_name,它的数据类型为varchar(30),那这样怎么写入定义游标时的SQL语句呢?非常感谢聪明的毛驴!我急着用!Top
10 楼smartdonkey(聪明的毛驴)回复于 2001-09-17 11:18:31 得分 20
你字段的数据的是什么,举个例子:你不是要根据y当列名建立表吗?比如数据如下
quip_name
车床
铣床
刨床
拖拉机
-------------
则可以这样(假设都建立int类型的字段)
declare @s varchar(1024)
declare @fld_name varchar(40)
declare mycursor cursor for select y from A
open mycursor
fetch mycursor into @fld_name
while @@fetch_status=0
begin
set @s=@s+@fld_name+'int ,'
fetch mycursor into @fld_name
end
set @s='create table mytable('+substring(@s,1,len(@s)-1)+')'
execute(@s)
go
insert into mytable(车床 ,铣床, 刨床, 拖拉机) values(11,32,13,14)
最后得到的表是这样的
车床 铣床 刨床 拖拉机
11 32 13 14
Top
11 楼xmao(地下室美老鼠)回复于 2001-09-17 11:33:52 得分 0
偶,学习。。学习。Top
12 楼N_chow(Yukon)回复于 2001-09-17 11:52:16 得分 0
這是一個比較簡單的問題,可以不用Cursor來實現。
你的y字段的值是否包含資料的型態??下面的例子是沒含型態,你可以根據自己的情況做修改。
declare @strCommand varchar(300)
set @strCommand =''
/*這里的字段所有的資型態都為 int,你可以自行設定, 如果每個字段的型態都不同的話,可以用另一個字段來存這些信息,然后把下面的int改為另一個字段的名字 */
select @strCommand=@strCommand+CASE WHEN @strCommand='' then '' else ',' end +'[' +y+']' +' int ' From A
select @strCommand
Declare @strExe varchar(350)
set @strExe='Create table B ( ' +@strCommand +' )'
exec ( @strExe )
Top
13 楼snaker2001()回复于 2001-09-18 11:12:16 得分 0
我的字段y的记录是中文的,因此我所建立的表B的列名也是中文的,但这样不行,我把记录换成英文(也就是字符)就可以了,聪明的毛驴,这怎么办呢,望请指点。不胜感激!Top
14 楼snaker2001()回复于 2001-09-18 11:34:51 得分 0
现在中文可以了,刚才不知道哪里出了问题。Top
15 楼suiyixin(随意)回复于 2001-09-18 13:01:50 得分 0
关注Top
16 楼smartdonkey(聪明的毛驴)回复于 2001-09-18 13:29:17 得分 0
中文是没问题的Top
17 楼snaker2001()回复于 2001-09-19 08:28:42 得分 0
谢谢聪明的毛驴,能不能看看这个帖子:http://www.csdn.net/expert/topicview1.asp
分必给!Top
18 楼smartdonkey(聪明的毛驴)回复于 2001-09-20 17:42:45 得分 0
没有啊,我访问不到.is-null@sohu.comTop




