首页 新闻 会员 周边 捐助

view 和对应的主表

0
悬赏园豆:10 [已解决问题] 解决于 2013-08-15 00:43
--1
use TMS_DEV
go
if exists (select * from sysobjects where id = object_id(N'[T111_MEDIA_Data]'))

IF EXISTS(SELECT 1 FROM sys.views WHERE name='V_MEDIA_DATA')
 DROP VIEW V_MEDIA_DATA
GO

CREATE VIEW V_MEDIA_DATA
AS
SELECT 
TMD.MediaId AS MEDIAID,
TMD.SubClientId AS SUBCLIENTID,
TCSC.SubClientName AS SUBCLIENTNAME,
TCSC.SubClientCode AS SUBCLIENTCODE,
TMD.SubLocationId AS SUBLOCATIONID,
TCCS.SubLoctationName AS SUBLOCATIONNAME,
TCCS.SubLocationCode AS SUBLOCATIONCODE,
TMD.DateId AS DATEID,
TMD.MediaType AS MEDIATYPE,
TMD.MediaSubType AS MEDIASUBTYPE,
TMD.SourceSystemId AS SOURCESYSTEMID,
TCSS.SourceSystemName AS SOURCESYSTEMNAME,
CONVERT(varchar(50),TMD.Amount) AS AMOUNT
FROM T_MEDIA_Data TMD
LEFT JOIN T_CSC_SubLocation TCCS ON TMD.SubLocationId=TCCS.SubLocationId
LEFT JOIN T_CSC_SubClient TCSC ON TMD.SubClientId=TCSC.SubClientId
LEFT JOIN T_CSC_SourceSystem TCSS ON TMD.SourceSystemId=TCSS.SourceSystemId

GO

 

想请问一下在创建view之前,首先要判断它相应的主表是否存在,如果存在就创建对于的view,不存在就不创建,怎么写的 是SQLServer的?我的代码如下,但是不正确的,求高手指点!用的是SQLServer 数据库
 
 
上浅草涯的主页 上浅草涯 | 初学一级 | 园豆:193
提问于:2013-08-11 02:59
< >
分享
最佳答案
0
IF object_id('dbo.tableName') IS NOT NULL     
    begin
       ....
    end    
收获园豆:6
Yu | 专家六级 |园豆:12990 | 2013-08-11 09:23

很遗憾的说,不行的,报错误的,兄弟,能帮帮我?

上浅草涯 | 园豆:193 (初学一级) | 2013-08-12 00:06

@上浅草涯:  上面的语句在你那能运行吧,是它报错还是其它的,还有具体报什么错呢

Yu | 园豆:12990 (专家六级) | 2013-08-12 11:08

@Yu: 都不用运行就报错了,去掉go后就是消息 156,级别 15,状态 1,第 8 行
关键字 'VIEW' 附近有语法错误。

上浅草涯 | 园豆:193 (初学一级) | 2013-08-12 22:18

@上浅草涯: create view ,它是只能单独存在于执行语块中的,所以只能以构建字符串的形式去处理了

use Test

IF object_id('dbo.Account') IS NOT NULL 
  
    begin  

    DECLARE @sql NVARCHAR(MAX);

    set @sql='CREATE VIEW [dbo].[View_3]
                AS
                SELECT Receipt
                FROM dbo.Account';

    EXEC sp_executesql @sql;

    end
Yu | 园豆:12990 (专家六级) | 2013-08-13 08:46

@Yu: 非常感谢

上浅草涯 | 园豆:193 (初学一级) | 2013-08-15 00:42
其他回答(2)
0
IF EXISTS(SELECT * FROM sys.objects o WHERE o.name=@tableName AND o.[type]='U')
BEGIN
--找到表后,该干嘛干嘛!    
END
GO
收获园豆:4
幻天芒 | 园豆:37207 (高人七级) | 2013-08-12 10:12

@Yu: 都不用运行就报错了,去掉go后就是消息 156,级别 15,状态 1,第 8 行
关键字 'VIEW' 附近有语法错误。

支持(0) 反对(0) 上浅草涯 | 园豆:193 (初学一级) | 2013-08-12 22:19

消息 102,级别 15,状态 1,第 4 行
“V_MEDIA_DATA”附近有语法错误。
消息 156,级别 15,状态 1,过程 V_MEDIA_DATA,第 22 行
关键字 'end' 附近有语法错误。

去掉 go后就和第一个错误相同了,我一开始也是以为和你们那样做,后来运行了发现不行的

支持(0) 反对(0) 上浅草涯 | 园豆:193 (初学一级) | 2013-08-12 22:20

@上浅草涯: 发现了。create view,必须是查询批次的第一条命令;

那不考虑表存在,如何?表不存在时,视图会自动创建失败...

支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-08-12 22:58

@幻天芒: 不考虑的话肯定会创建成功的,现在就是想考虑表存在这个

支持(0) 反对(0) 上浅草涯 | 园豆:193 (初学一级) | 2013-08-13 00:21

@上浅草涯: 测试了半天,发现动态语句可以执行。

IF EXISTS(
       SELECT *
       FROM   sys.objects o
       WHERE  o.name = @tableName
              AND o.[type] = 'U'
   )
BEGIN
    EXEC ('create view V_test as select * from ' + @tableName)
END
GO
支持(0) 反对(0) 幻天芒 | 园豆:37207 (高人七级) | 2013-08-13 09:55

@幻天芒: 非常感谢

支持(0) 反对(0) 上浅草涯 | 园豆:193 (初学一级) | 2013-08-15 00:41
0

先判断是否存在该表如果存在进行操作,

IF EXISTS(SELECT * FROM sys.objects s WHERE s.name=@tableName)
BEGIN
--如果找到标了,就进行view的操作!    
END
GO
 
妍珊 | 园豆:1169 (小虾三级) | 2013-08-12 10:53

和上面所说的一样的错误

支持(0) 反对(0) 上浅草涯 | 园豆:193 (初学一级) | 2013-08-12 22:22
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册