求一存储过程

alphawin 2004-04-26 10:51:49
数据库中有3张表,第一张bm里有二个字段,ID和TABLENAME,第二张bsx有ID和zdsx(字段类型),第三张有ID,tablename(和bm的tablename关联),zdm(字段名),zdsx(和bsx的zdsx关联),字段长度.
求一存储过程能传一参数(表名)根据第一张表里的tablename在数据库中生成表。字段名称,字段类型和长度根据第2和第3张表来。
...全文
61 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sy246 2004-04-26
  • 打赏
  • 举报
回复
狠!
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
临时表可以不用哦
可以精简一下:)
hivak47 2004-04-26
  • 打赏
  • 举报
回复
向高手们学习!!!!!!!!!!!!!!!
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
具体的你可以看一下生成的Create Sql语句是否正确,不对的地方稍微改下就可以了
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
t3
id tableid zdlxid(字段名类型ID) zdm
1 1 1 id
2 1 2 createtime
3 1 3 password
4 1 4 username

对于这个t3表,最好加上字段 zdlen(长度),iskey(是否主键)
这样处理更好一些
alphawin 2004-04-26
  • 打赏
  • 举报
回复
我马上试一下,成功就给分啊
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
我给出我的表结构,供楼主参考

t1

id tablename

1 MyTable


t2

id zdsx(字段类型)

1 int
2 datetime
3 char
4 varchar

t3

id tableid zdlxid(字段名类型ID)





zdm
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
sorry ,上面的
set @sql = 'create table [dbo].[' + @tablename + ']{'
应该为
set @sql = 'create table [dbo].[' + @tablename + ']('

set @sql = @sql + '}on[PRIMARY]'
应该为 set @sql = @sql + ')on[PRIMARY]'

我用错括号了

还有:
你的第三个表里面,除了字段类型之外,还要有一个字段,用来描述字段的长度,比如说
字段类型 长度
varchar 128
最好还有一个字段,表示是否为主键

大概就是这么个意思
我已经调试通过

edobnet 2004-04-26
  • 打赏
  • 举报
回复
动态SQL
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
大概是下面的意思



select a.tablename,c.zdm,b.zdsx into #temp from t1 a,t2 b,t3 c where c.tableid = a.id and c.zdlxid = b.id and c.tableid = 1

declare @sql varchar(8000)
declare @tablename varchar(128)
declare @itemname varchar(128)
declare @itemtype varchar(128)


select @tablename=tablename from #temp

DECLARE MyCursor CURSOR FOR select zdm,zdsx from #temp

set @sql = 'create table [dbo].[' + @tablename + ']{'

OPEN MyCursor

FETCH NEXT FROM MyCursor into @itemname,@itemtype
WHILE @@FETCH_STATUS = 0
BEGIN
set @sql = @sql + '[' + @itemname + ']['+ @itemtype + '],'
FETCH NEXT FROM MyCursor into @itemname,@itemtype
END

select @sql = substring(@sql,0,len(@sql))

set @sql = @sql + '}on[PRIMARY]'

CLOSE MyCursor

print @sql

exec @sql

drop table #temp
DEALLOCATE MyCursor

alphawin 2004-04-26
  • 打赏
  • 举报
回复
麻烦把具体的这个存储过程写出来,好吗
洪十二 2004-04-26
  • 打赏
  • 举报
回复
用动态SQL.
1.execute immediate 'create table ......'
2.dbms_sql.parse
CMIC 2004-04-26
  • 打赏
  • 举报
回复
关联三张表,开一个游标,一个一个见表,不应该太难就是麻烦。
如果可以下写两个用户函数,通过表名获得字段类型和长度,然后在存储工程中调用,可能容易些。
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
建议
取出字段的信息这个不用说了吧
在Sqlserver中找一个表
看看它的sql脚本
直接拿来改改用就可以了
brightheroes 2004-04-26
  • 打赏
  • 举报
回复
修改两个地方
1:declare @sql varchar(8000) -->declare @sql nvarchar(4000)
2:exec @sql ---> exec sp_executesql @sql
这样就OK了
alphawin 2004-04-26
  • 打赏
  • 举报
回复
exec @sql执行不了啊,创建存储过程可以通过,但运行时不可以
alphawin 2004-04-26
  • 打赏
  • 举报
回复
我的表里本来就有字段长度啊,像int型就可以默认长度,而char就要指定长度拉,你没考虑 吧

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧