您的位置:程序门 -> ms-sql server -> 应用实例



创建视图疑难问题,邹建同志请进!


[收藏此页] [打印本页]选择字色:背景色:字体:[][][]


创建视图疑难问题,邹建同志请进![已结贴,结贴人:soft78]
发表于:2007-01-29 10:25:49 楼主
有数据库d1和d2,d1中有表t1,d2中有表t2。由于特殊需要,要在d2中建一存储过程p1,p1的功能是先判断d1中如果有名为t1的表则删除,如果有名为t1的视图则删除;然后在数据库d1中建立一个名为t1的视图,t1的内容和数据库d2中的表t2相同。该存储过程如何写?
发表于:2007-01-29 10:31:591楼 得分:0
走错地方,只有邹建进来
发表于:2007-01-29 14:04:452楼 得分:0
来看看而已。。。。。。。。呵呵
发表于:2007-01-29 14:09:553楼 得分:0
路过~~~
发表于:2007-01-29 14:17:484楼 得分:0
大家都是路过,不符合csdn的风格呀
发表于:2007-01-29 14:52:015楼 得分:0
试试opendatasource
发表于:2007-01-29 15:55:556楼 得分:0
哈哈`那就在d1中建的视图访问d2的表就行了。。这样他们的数据内容肯定一样滴。
发表于:2007-01-29 15:58:557楼 得分:0
那就在d1中建的视图访问d2的表就行了
------------------------------------
出于安全需要,这个视图的创建要在d2的存储过程里实现,另外如何判断d1中是否有名为t1的表或视图?
发表于:2007-01-29 16:43:308楼 得分:80
然后在数据库d1中建立一个名为t1的视图,t1的内容和数据库d2中的表t2相同
----------------------------------------------------------------------

这个视图的基础表是什么?   来自d2库吗?   如果这样,   似乎问题有多,   要求d1能正确访问d2,   而它们的身份验证很难解决,   除非你在这个处理外先解决好身份验证的问题.


至于判断对象是否存在及删除嘛,   倒是可以考虑利用openrowset,   判断是否存在通过查询d1的系统表(sysojects)就可以了,   是否存在和类型都可以判断出来

使用openrowset删除对象时,   要注意事务的问题,   需要设置(set   implicit_transactions   off),   并且处理的语句中,   需要包含一个最简单的返回结果集的语句(openrowset要求有返回结果集)

发表于:2007-01-29 16:45:589楼 得分:0
在创建视图方面,   得考虑动态语句,   通过查询syscomments系统表可以获得视图定义语句,   然后把这个语句拼到openrowset中去创建视图.   注意得拼入EXEC中,   因为openrowset中除了创建视图的语句,   还要求有其他语句

发表于:2007-01-29 16:47:3610楼 得分:0
这个里面,   最主要是要确定准备创建的视图的内容,   因为这个视图来自于d2,   所以在d1上创建时,   是使用同样的脚本,   还是要做调整,   这是必须明确的.

另外就是身份验证问题,   必须确定两个数据库之间的身份验证方式
发表于:2007-01-29 16:49:0811楼 得分:0
当然,   除了openrowset,   只要你的权限足够,   你还可以用xp_cmdshell调用外部的一些工具(osql之类)来解决问题.
发表于:2007-01-29 17:01:3712楼 得分:10
兄弟,試圖的創建和刪除都是不可以跨數據庫操作的。所以如果你一定要這麼做的話,只能在數據庫d1中創建一個存儲過程專門用來刪除和創建試圖,然後在d2中傳建的存儲過程來調用d1中的這個存儲過程從而實現跨數據庫的試圖的刪除和傳建,代碼如下:
首先在d1中傳建一個存儲過程
create   proc   [dbo].[sp_dcview]

@type   int,
                  ----0:表示刪除試圖,其它值表示創建試圖
@viewname   varchar(20)
                  ----需要創建或者是刪除試圖的名稱
)  
as  
declare   @sql   nvarchar(800)
if(@type   =   0)  
---drop   the   view  
begin
set   @sql   =   n 'drop   view   '+@viewname
end
else  
begin
set   @sql   =   n 'create   view   '+@viewname+
n '   as   '+
n 'select   *   from   d2.dbo. '+@viewname;
end
EXEC   sp_EXECutesql   @sql;
go


然後再在d2中傳建你所需要的存儲過程:
create   proc   [dbo].[sp_createt]  
(@objectname   varchar(30))
as  
if   exists(select   *   from   d1.dbo.sysobjects  
where   type   =   'u '   and   name   =   @objectname)  
begin   EXEC   ( 'drop   table   d1.dbo. '+@objectname)   end  

if   exists(select   *   from   d1.dbo.sysobjects  
where   type   =   'v '   and   name   =   @objectname)  
begin   EXEC   northwind.dbo.sp_dcview   0,@objectname   end  

EXEC   northwind.dbo.sp_dcview   1,@objectname  

go

這樣就可以實現目的了。還有如果要判斷是否有名稱為xxx的某一個試圖或者是表的存在還可以用
object_id()這個函數,比如上面的判斷條件可以改為:
if   object_id(@objectname, 'v ')   is   not   null  
具體可以參考sql   online   book.


发表于:2007-01-29 22:08:4813楼 得分:0
邹建:视图t1的基础表是d2中的t2。这两个数据库我用的都是sa用户能解决身份验证问题么
发表于:2007-01-30 11:03:0314楼 得分:0
学习
发表于:2007-01-30 11:23:1615楼 得分:10
1.利用sysobject系统表来获取某个视图或表是否存在,然后利用sql的删除命令来将其删除

2.利用syscomments系统表来获取指定视图的内容,如果你创建视图时不依照原视图来创建,也可以忽略此步

发表于:2007-01-30 13:04:1616楼 得分:0
mark
发表于:2007-01-30 19:19:4917楼 得分:0
楼主纯粹吃饱了撑的,为什么要写一个存储过程?而且还要在d2中执行,写个sql脚本不就行了
use   d1
go
if   exists(select   id   from   sysobjects   where   name= 't1 '   and   xtype= 'u ')
    drop   table   t1
if   exists(select   id   from   sysobjects   where   name= 't1 '   and   xtype= 'v ')
    drop   view   t1
go
create   view   t1
as
select   *   from   d2..t2


快速检索

最新资讯
热门点击