• 主页
  • 基础类
  • 应用实例
  • 新技术前沿

MSSQL中,有位网友email问我的问题,下面是我给出的方案,大家也来看一看吧.(zhuzhichao)

zhuzhichao 2002-01-30 10:03:24
加精
问题描述:
有表Table2,其结构及内容如下:
Table2:

id name1 name2 name3 ……(列有很多)
1 aa bb cc ……
2 ii jj kk ……
3 xx yy zz ……
…………………………………………

有表Table1,其结构如下:
Table1:
id variable

现在想把Table2中的除id以外的字段名(注意,是字段名)填入Table1中的id,
从Table2中提取某一行(先假设是id为1的那一行吧)中与每个字段名对应的内容填入Table1的variable.

以id为1的那行为例,就是要达到如下的效果:
Table1:
id variable
name1 aa
name2 bb
name3 cc
……………….


我的解决方案:

declare @vVariable varchar(2000),@var varchar(2000) --中間值的變量
declare @sql nvarchar(4000) -- 動態sql
declare @insertSql varchar(4000) -- 插入臨時表的sql
set @vVariable = ' '
if object_id('tempdb.dbo.#temp1') is not null
drop table #temp1
select identity(int) id,name into #temp1 from syscolumns where id = object_id('Table2') and name <> 'id' order by colid

if object_id('tempdb.dbo.#temp2') is null -- 創建臨時表#temp2
create table #temp2
(
id int identity,
variable varchar(10)
)
else
truncate table #temp2

select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
object_id('Table2') and name <> 'id' order by colid
set @vVariable = right(@vVariable,len(@vVariable) - 6)
set @sql = 'select @var = '+@vVariable+' from Table2 where id = 1'
exec sp_executesql @sql,N'@var varchar(2000) output',@var output -- 組成以逗號分格的變量@var

set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
insert into #temp2 values(''')+''')'
exec (@insertSql) -- 根據變量中的逗號分格插入臨時表

insert into Table1(id,variable)
select name,variable from #temp1,#temp2
where #temp1.id = #temp2.id

select * from Table1
...全文
1911 点赞 收藏 59
写回复
59 条回复
liuhu_2001 2002年02月06日
如果是查找指定行,将:
Rs.Open "select * from table2",Conn,1,3
改成:
Rs.Open "select * from table2 where id="&ColNumber,Conn,1,3
'ColNumber为你要提取的行
回复 点赞
liuhu_2001 2002年02月06日
对于这个问题,大家用的存储过程方式有解决,我觉得都不错!但解决方法总是多样的,我喜欢用ADO+ASP解决,或者在VB中写一个DLL。请看我的思路:
Rs.Open "select * from table2",Conn,1,3
dim TempStr
for i=1 to Rs.RecordCount
if Rs.eof or Rs.bof then exit for
for j=1 to Rs.Fields.Count-1
TempStr=Rs.Fields(j)
'如table1中id是identity的话
Conn.Execute "insert table1(variable) values('"&TempStr&"')"
next
Rs.MoveNext
next
Conn.Close
Rs.Close
多简单,才十几行代码!
回复 点赞
ferbruary 2002年02月06日
收藏!
回复 点赞
ltltlt 2002年02月05日
to green_girl(无名的裘德):
set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
insert into #temp2 values(''')+''')'
好象是两句,实际只有一句,因为'最后才闭合.
set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
后有一回车,目的为了产生一连串的insert into语句
回复 点赞
易杰ERP 2002年02月05日
关注
回复 点赞
zhuzhichao 2002年02月05日
再置頂兩天後結貼.
回复 点赞
N_chow 2002年02月05日
study
回复 点赞
amsea 2002年02月05日
开始是简体汉字,后来变成是繁体?
不明白,思考中……
回复 点赞
zlps 2002年02月05日
学习。
这种技巧对应的实际应用是什么?不会是玩文字游戏吧?
回复 点赞
man_zhou_sf 2002年02月05日
这种的答案也正是我需要,呵呵。
谢谢你!zhuzhichao(炎龙骑士团—索尔—破龙击)
回复 点赞
goldenfinger413 2002年02月05日
ok 崇拜你!!!!!!!!
回复 点赞
panther_totem 2002年02月05日
看看,好好看看。
回复 点赞
jsidiot 2002年02月04日
我一点也看不懂
不过还是收藏一下
呵呵
回复 点赞
Brad 2002年02月04日
不知道执行过没有,反正我无法执行
第一,
select @vVariable = @vVariable + '+'',''+' + name from syscolumns where id =
object_id('Table2') and name <> 'id' order by colid
好象是以+,+分隔的,并不是,

另外,set @sql = 'select @var = '+@vVariable+' from Table2 where id = 1'
这句SQL好象返回的是
A SELECT statement that assigns a value to a variable must not be combined with data-retrieval operations.





回复 点赞
green_girl 2002年02月04日
set @insertSql='insert into #temp2 values('''+REPLACE(@var,',',''')
insert into #temp2 values(''')+''')'

这句 什么 意思?
回复 点赞
supsuccess 2002年02月03日
xuexi !
回复 点赞
zlb2000 2002年02月03日
介绍给大家一个好东东: http://www27.brinkster.com/zlb1978

科旭即时通是一个优秀的即时通讯软件,该软件采用分布式结构,包括服务器和客户端两部分,适用于局域网,广域网,和WWW三种网络体系,用户可以自主设置服务器和通讯端口,可方便迅速地在单位内部建立起多个独立的聊天体系。


回复 点赞
conanbos 2002年02月03日
没想到竹大哥给我回答的一个问题能让这么多人引起共鸣,哈哈。
回复 点赞
halfdream 2002年02月03日
有种转置矩阵表的技巧,在数据库上很有用..
可以不用这些存贮过程............
....可有人感兴趣吗?



回复 点赞
xiezq_136 2002年02月02日
不太懂,先研究研究
回复 点赞
发动态
发帖子
MS-SQL Server
创建于2007-09-28

1.4w+

社区成员

25.3w+

社区内容

MS-SQL Server相关内容讨论专区
社区公告
暂无公告