我需要创建一个视图,但是数据是从一个具有自己的db管理的应用程序生成的,该应用程序基于列计数可以为一个内部表定义创建超过7个Server表。
这些表都以'm‘& number结尾(如devicem1,devicem2 . 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可能不存在?
发布于 2012-05-09 02:38:08
关于一种观点的要求。创建视图时,引用的表必须存在。SQL引擎将不允许您创建引用不存在表的视图。
考虑到视图只是存储的select语句,在创建它之后,可以删除表(只要模式绑定不起作用);但是,无论何时调用或使用该视图,所有引用的表都必须存在,否则会抛出错误。
此外,您还可以更改引用表的架构,只要它不删除视图中专门使用的任何字段,但如果视图使用的特定列缺少任何使用该视图的查询,则同样会失败。
您可能会更幸运地尝试使用一些有创意的表值函数和动态sql来完成您的任务。表值函数基本上只是一个允许参数和扩展逻辑的视图。
总之,我想说的是,你的描述听起来有点粗略。
发布于 2012-05-09 02:52:34
我将根据可用的表定期重新创建视图。
因此,如果应用程序每晚运行以创建表,那么在应用程序运行之后,检查哪些表可用并重新创建视图。
最后,您必须使用动态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);https://stackoverflow.com/questions/10508899
复制相似问题