【问题标题】:Create a view with changing table names创建具有更改表名的视图
【发布时间】:2018-09-12 18:58:38
【问题描述】:

我们有一组带有星期后缀的表格(Table_Mon、Table_Tue 等)。我正在尝试设计一个应用程序可以在当前的任何一天从这些列中提取一组有限的数据。我正在考虑在视图中使用动态 sql,但这不是一个选项。什么是正确的解决方案,以便应用程序可以在不需要提供星期几的情况下查询表?

【问题讨论】:

  • 您将需要使用动态 sql,但您应该使用存储过程而不是视图。
  • 我很想问为什么存在 Table_Mon、Table_Tue 等等……它们不仅仅是主表上的视图,是吗?表中是否有实际标识它的数据 - 可能是日期列?如果是这样,也许将它们联合在一起并在标识列上应用条件。
  • 如果应用程序不提供一周中的某一天,您的动态内容如何知道要查询哪个表?
  • @9bO3av5fw5 这些是来自供应商系统的数据快照,以便可以查看和报告每天的变化。
  • @EricBrandt 该应用程序只关心“今天”的数据。这就是为什么我希望创建一个抽象出星期几的视图。

标签: sql-server sql-server-2016


【解决方案1】:

这是一个设计不佳的数据库模式。理想情况下,应该只有一个表包含 Week_Day 列,并且您应该能够通过添加适当的 WHERE 子句来查询该表。

无论如何,您将需要使用动态 sql,但您应该使用存储过程而不是视图。比如……

CREATE PROCEDURE dbo.Get_Data
AS
BEGIN 
   SET NOCOUNT ON;

    DECLARE  @Sql       NVARCHAR(MAX)
            ,@TableName SYSNAME; 

    SET @TableName = N'TABLE_' + LEFT(DATENAME(WEEKDAY, GETDATE()) , 3);

    SET @Sql = N' SELECT * FROM ' + QUOTENAME(@TableName)

    Exec sp_executesql @Sql

END

【讨论】:

  • “需要使用动态sql”有点牵强。可以轻松地创建基于日期运行不同选择的 if 语句。 :)
  • @UnhandledExcepSean 但这样做会导致非常糟糕的性能。如果采用这种方法,您将需要主程序和每个路径的不同程序。
  • @SeanLange 只有在它使用错误的执行计划时才能这样做,但是您可以按照您的建议将其中断,或者选择重新编译,这似乎与此答案的作用没有太大不同。跨度>
  • @UnhandledExcepSean 甚至针对未知进行优化。 ;) 到目前为止,最好的解决方案是修复架构。
  • @UnhandledExcepSean 回应您的评论“选项重新编译,这似乎与此答案的作用没有太大不同”,恐怕您的假设是错误的,sp_executesql 将受益于缓存参数化执行计划,和使用option recompile不一样,其实恰恰相反。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-06-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多