2

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

表格都以 ['m' & number] 结尾,例如devicem1devicem2...devicem10

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

我需要创建一个将表连接在一起的视图,device这样当应用程序更改时它不会弄乱我想要创建的任何存储过程。

基于此查询:

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可能不存在的事实?

4

2 回答 2

2

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

考虑到视图只是一个存储的选择语句,在它创建之后可以删除表(只要模式绑定不在游戏中);但是,任何时候调用或使用视图时,所有引用的表都必须存在,否则会抛出错误。

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

您可能更幸运地摆脱了您尝试使用一些创造性的表值函数和动态 sql 所做的事情。表值函数基本上只是一个允许参数和扩展逻辑的视图。

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

于 2012-05-09T02:38:08.063 回答
2

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

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

最后,您将不得不使用动态 sql,执行以下操作:

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);
于 2012-05-09T02:52:34.800 回答