存储过程中创建视图的问题!!

baggio785 2006-06-26 09:34:48
set @sql = 'if not exists (select 1
from sysobjects
where id = object_id(''dbo.V_'+@tablename_detail+''')
and type = ''V'')

CREATE VIEW dbo.V_'+@tablename_detail+'
AS
SELECT dbo.'+@tablename_detail+'.downmain_id,
dbo.'+@tablename_detail+'.downmain_companyid,
dbo.'+@tablename_detail+'.downmain_songerid,
dbo.'+@tablename_detail+'.downmain_specialid,
dbo.'+@tablename_detail+'.downmain_songid,
dbo.'+@tablename_detail+'.downmain_browse,
dbo.'+@tablename_detail+'.downmain_download,
dbo.'+@tablename_detail+'.downmain_income,
dbo.'+@tablename_detail+'.downmain_date,
dbo.'+@tablename_detail+'.download_source, dbo.c_company.companyName,
dbo.music_song.songname, dbo.music_songer.songerName,
dbo.music_special.specialname, dbo.music_song.addtime
FROM dbo.music_special INNER JOIN
dbo.music_songer INNER JOIN
dbo.stat_downmain_200604 INNER JOIN
dbo.music_song ON
dbo.'+@tablename_detail+'.downmain_songid = dbo.music_song.id ON
dbo.music_songer.id = dbo.'+@tablename_detail+'.downmain_songerid ON
dbo.music_special.id = dbo.'+@tablename_detail+'.downmain_specialid INNER JOIN
dbo.c_company ON
dbo.'+@tablename_detail+'.downmain_companyid = dbo.c_company.id'
exec(@sql)

错误提示为view关键字附近有语法错误,查了一下资料,说创建视图必须在一个事务内,因此create前必须有go关键字,如果按照一般的sql语句来创建没问题,现在我是根据if条件来创建视图,请大家帮忙看看!!
...全文
263 6 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
soft78 2007-01-29
  • 打赏
  • 举报
回复
学习
hellowork 2006-06-26
  • 打赏
  • 举报
回复
只能使用动态SQL语句了.在该语句中,当条件符合时,动态生成一个CREATE VIEW字符串并EXEC执行.
declare @sql varchar(3000)
declare @tablename_detail varchar(50)
set @tablename_detail = 'tmp'
set @sql = 'if not exists (select 1
from sysobjects
where id = object_id(''dbo.V_'+@tablename_detail+''')
and type = ''V'')
BEGIN
declare @defview varchar(1000)
set defview = ''
CREATE VIEW dbo.V_'+@tablename_detail+'
AS
SELECT dbo.'+@tablename_detail+'.downmain_id,
dbo.'+@tablename_detail+'.downmain_companyid,
dbo.'+@tablename_detail+'.downmain_songerid,
dbo.'+@tablename_detail+'.downmain_specialid,
dbo.'+@tablename_detail+'.downmain_songid,
dbo.'+@tablename_detail+'.downmain_browse,
dbo.'+@tablename_detail+'.downmain_download,
dbo.'+@tablename_detail+'.downmain_income,
dbo.'+@tablename_detail+'.downmain_date,
dbo.'+@tablename_detail+'.download_source, dbo.c_company.companyName,
dbo.music_song.songname, dbo.music_songer.songerName,
dbo.music_special.specialname, dbo.music_song.addtime
FROM dbo.music_special INNER JOIN
dbo.music_songer INNER JOIN
dbo.stat_downmain_200604 INNER JOIN
dbo.music_song ON
dbo.'+@tablename_detail+'.downmain_songid = dbo.music_song.id ON
dbo.music_songer.id = dbo.'+@tablename_detail+'.downmain_songerid ON
dbo.music_special.id = dbo.'+@tablename_detail+'.downmain_specialid INNER JOIN
dbo.c_company ON
dbo.'+@tablename_detail+'.downmain_companyid = dbo.c_company.id' + '''' + '
EXEC(@defview)
END'
--print @sql
exec(@sql)
baggio785 2006-06-26
  • 打赏
  • 举报
回复
谢谢二位~
simonhehe 2006-06-26
  • 打赏
  • 举报
回复
不好意思,应该将if not exists(select name from sysobjects where name = @tablename and type = 'v')中的name = @tablename 改成 name = @view

simonhehe 2006-06-26
  • 打赏
  • 举报
回复
-------------如果上面的语句调不通,你就按下边的方式就OK
--建立存储过程
create proc create_view
@tablename varchar(100),
@view varchar(100)
as
begin tran
if not exists(select name from sysobjects where name = @tablename and type = 'v')
exec('create view dbo.'+@view+' as
select * from '+@tablename
)
commit tran
go

--建立测试数据
CREATE TABLE [t1] ([id] [int] IDENTITY (1, 1) NOT NULL ,[col] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY]
GO
insert into t1 select 23

--执行
exec dbo.create_view t1,viewt1
simonhehe 2006-06-26
  • 打赏
  • 举报
回复
--调整楼上的语句

declare @sql varchar(3000)
declare @tablename_detail varchar(50)
set @tablename_detail = 'tmp'
set @sql = 'if not exists (select 1 from sysobjects where id = object_id(''dbo.V_'+@tablename_detail+''')and type = ''V'')'
--print @sql
BEGIN
declare @defview varchar(1000)
set @defview = ''
select @defview='
CREATE VIEW dbo.V_'+@tablename_detail+'
AS
SELECT dbo.'+@tablename_detail+'.downmain_id,
dbo.'+@tablename_detail+'.downmain_companyid,
dbo.'+@tablename_detail+'.downmain_songerid,
dbo.'+@tablename_detail+'.downmain_specialid,
dbo.'+@tablename_detail+'.downmain_songid,
dbo.'+@tablename_detail+'.downmain_browse,
dbo.'+@tablename_detail+'.downmain_download,
dbo.'+@tablename_detail+'.downmain_income,
dbo.'+@tablename_detail+'.downmain_date,
dbo.'+@tablename_detail+'.download_source, dbo.c_company.companyName,
dbo.music_song.songname, dbo.music_songer.songerName,
dbo.music_special.specialname, dbo.music_song.addtime
FROM dbo.music_special INNER JOIN
dbo.music_songer INNER JOIN
dbo.stat_downmain_200604 INNER JOIN
dbo.music_song ON
dbo.'+@tablename_detail+'.downmain_songid = dbo.music_song.id ON
dbo.music_songer.id = dbo.'+@tablename_detail+'.downmain_songerid ON
dbo.music_special.id = dbo.'+@tablename_detail+'.downmain_specialid INNER JOIN
dbo.c_company ON
dbo.'+@tablename_detail+'.downmain_companyid = dbo.c_company.id'
--print @defview
EXEC(@defview)
END

exec(@sql)

34,838

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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