存储过程里如何动态建表?参数是不定的。

Animatrix 2007-01-29 09:30:15
举个例子吧:有一个电话表,里面其中一个字段是电话类型,现在存储过程的任务是建立一个表,把每种电话类型变成新表的字段,请问如何实现呢?
请写个存储过程的例子,谢谢,在线等!
...全文
379 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
哦,知道问题所在了。。不好意思,我自己疏忽了
我再试试先。。
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
gc_ding(施主,给个妞泡好么):
你写的我试了可以
但是用到我的数据库上就不行,不知道为什么
我现在是要从ReportField中取ReportFieldName这一列的值
成为一张新的表的字段
前面说电话是举的例子,具体我上面:
alter proc cre_tb
as
declare @sql nvarchar(4000)
set @sql='create table NewTestTable(id int, '
select @sql=@sql+ReportFieldName+' varchar(50), '
from ReportField
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
select * from NewTestTable
go

exec cre_tb

然后就报错误:

服务器: 消息 2705,级别 16,状态 3,行 1
各表中的列名必须唯一。在表 'NewTestTable' 中多次指定了列名 'id'。
服务器: 消息 208,级别 16,状态 1,过程 cre_tb,行 9
对象名 'NewTestTable' 无效。
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
这个。。。看不太明白,不知道怎么执行,请高手再指点一下
#t是临时表?新建的表呢?

Case when 电话类型 when '''+ 电话类型+''' then 号码 else '''' end

这个也不懂
gc_ding 2007-01-29
  • 打赏
  • 举报
回复
--写成存储过程如下
create table 电话表(电话类型 nvarchar(100))
insert 电话表
select '国内长途' union all
select '市话' union all
select '手机' union all
select '国外长途'
go

create proc cre_tb
as
declare @sql nvarchar(4000)
set @sql='create table 新表(id int, '
select @sql=@sql+电话类型+' varchar(100), '
from 电话表
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
select * from 新表
go

exec cre_tb

drop table 电话表,新表
drop proc cre_tb

/*
id 国内长途 市话 手机 国外长途
*/
gc_ding 2007-01-29
  • 打赏
  • 举报
回复
create table 电话表(电话类型 nvarchar(100))
insert 电话表
select '国内长途' union all
select '市话' union all
select '手机' union all
select '国外长途'

declare @sql nvarchar(4000)
set @sql='create table 新表(id int, '
select @sql=@sql+电话类型+' varchar(100), '
from 电话表
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)

select * from 新表

drop table 电话表

/*
id 国内长途 市话 手机 国外长途
*/
WangZWang 2007-01-29
  • 打赏
  • 举报
回复
--try to

Create proc procName
as
set nocount on
Declare @sql varchar(8000)
Select @sql='Select identity(int,1,1) as ID,'
Select @sql=@sql+', (Case when 电话类型 when '''+
电话类型+''' then 号码 else '''' end) ['+电话类型+']'
from (Select distinct 电话类型 from 电话表) as a

Select @sql=@sql+' Into #t from 电话表 Select * from #t '

Exec(@SQL)
Set nocount off
go
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
急用,在线等高手!
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
楼上的,不是这个意思啊,我的意思是这样的:
比如电话表里有个字段叫电话类型
1 国内长途
2 市话
3 手机
4 国外长途
5 。。。




现在我要用一个存储过程,建立一张表
结构变成这样
id | 国内长途 | 市话 | 手机 | 国外长途 。。。
1 asas ags aafs asf
2 bbq fsdf gjh jytr


参数是不定的,这个存储过程怎么写呢?
WangZWang 2007-01-29
  • 打赏
  • 举报
回复
先建立一个对应关系表,如:
Create table TelType
(id integer identity(1,1) primary key, --
type varchar(20) --电话类型
)

--调整对应关系
Insert Into TelType(type)
Select distinct 类型字段 from 电话表

Update a set a.类型字段=ltrim(b.id)
from 电话表 as a inner Join TelType as b on a.类型字段=b.type
Animatrix 2007-01-29
  • 打赏
  • 举报
回复
ALTER proc test_insert_Report
(
@Name varchar(50),
@TableName varchar(50),
@CategoryName varchar(50)
)
as
declare @CategoryID int
declare @sql nvarchar(4000)
set @sql='create table aaaaa('
select @sql=@sql+ReportFieldName+'varchar(50),'
from ReportField where ReportID = '1'
set @sql=left(@sql,len(@sql)-1)+')'
exec(@sql)
select @CategoryID=[ID] from DataCategory where [Name]=@CategoryName
insert into Report values(@Name,@TableName,@CategoryID)
go

还是有问题啊
这个是我项目里的
用途是一张Report表里插入一条数据后,要自动生成一张新的表
现在问题还有几个:
1:根本没有建立aaaaa这张表

2:就算建立了,其实这个表名aaaaa应该是参数@TableName里来的,怎么让他从参数@TableName里来?也就是说create table ????这里怎么写?我这里新建表不能成功,所以我也测试不了,只能暂时写个aaaaa了。

3:执行这个存储过程exec test_insert_Report 'Test','aaaaa','财务报表'后,可以执行成功,但是报一个错:
服务器: 消息 173,级别 15,状态 1,行 1
列 'idvarchar' 的定义中必须包括数据类型。

(所影响的行数为 1 行)

4:where ReportID = '1',这个1应该是Report表插入一条数据后自动增长的一个主键的值,这个值怎么得到呢?也就是说where ReportID =????什么呢。。
sxdtwlx_bj 2007-01-29
  • 打赏
  • 举报
回复
不知道select 有这种作用呢,还得努力学习!!!!

22,210

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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