首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Server 2005在视图中连接多个表,而某些表可能不存在

问Server 2005在视图中连接多个表,而某些表可能不存在
EN

Stack Overflow用户
提问于 2012-05-09 01:54:51
回答 2查看 139关注 0票数 2

我需要创建一个视图,但是数据是从一个具有自己的db管理的应用程序生成的,该应用程序基于列计数可以为一个内部表定义创建超过7个Server表。

这些表都以'm‘& number结尾(如devicem1,devicem2 . devicem10 )

它们都包含logical_name作为它们的主键,但是您永远不能依赖于哪个表将容纳内部表中的任何其他列!

我需要创建一个将表作为device连接在一起的视图,因此当应用程序更改时,它不会破坏我想要创建的任何存储过程。

基于此查询:

代码语言:javascript
复制
CREATE VIEW device AS
   SELECT *
   FROM devicem1 m1, devicem2 m2, devicem3 m3, ... devicem10 m10
   WHERE m1.logical_name = m2.logical_name
   AND m1.logical_name = m3.logical_name
   ...
   AND m1.logical_name = m10.logical_name

有什么方法可以让我忽略的十个表-- devicem9 & devicem10可能不存在?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-05-09 02:38:08

关于一种观点的要求。创建视图时,引用的表必须存在。SQL引擎将不允许您创建引用不存在表的视图。

考虑到视图只是存储的select语句,在创建它之后,可以删除表(只要模式绑定不起作用);但是,无论何时调用或使用该视图,所有引用的表都必须存在,否则会抛出错误。

此外,您还可以更改引用表的架构,只要它不删除视图中专门使用的任何字段,但如果视图使用的特定列缺少任何使用该视图的查询,则同样会失败。

您可能会更幸运地尝试使用一些有创意的表值函数和动态sql来完成您的任务。表值函数基本上只是一个允许参数和扩展逻辑的视图。

总之,我想说的是,你的描述听起来有点粗略。

票数 2
EN

Stack Overflow用户

发布于 2012-05-09 02:52:34

我将根据可用的表定期重新创建视图。

因此,如果应用程序每晚运行以创建表,那么在应用程序运行之后,检查哪些表可用并重新创建视图。

最后,您必须使用动态sql,执行如下操作:

代码语言:javascript
复制
declare @sql varchar(max);

select @sql = (select '(select * from '+table_name+') union all'
               from information_schema.tables
               for xml path (''));
set @sql = left(@sql, len(@sql) - 10);

set @sql = 'create view <whatever> as '+@sql;
exec(@sql);
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10508899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档