【问题标题】:Query table-per-month data without dynamic SQL不使用动态 SQL 查询表月数据
【发布时间】:2018-11-05 12:58:25
【问题描述】:

供应商以其无限的智慧决定将假期数据集按月拆分为单独的表,即

holidayPlanner.dbo.holiday_201802
holidayPlanner.dbo.holiday_201803
holidayPlanner.dbo.holiday_201804
holidayPlanner.dbo.holiday_201805

系统会在员工请求当月假期时立即生成这些表格。我可以编写一个使用动态 SQL 的查询来创建一个我可以使用的 UNION 查询。

有没有什么方法可以在没有动态 SQL 的情况下完成?理想情况下,我可以创建一个表值函数来获取结果?

【问题讨论】:

  • 你能让他们创建一个将数据合并在一起的视图吗?尽管这也需要他们更新该视图作为流程的一部分。
  • 我建议了一个 DDL 触发器,它使用基于来自 sys.tables 的数据的动态 SQL 重新创建视图。我仍然希望有一个不需要动态 SQL 的解决方案。
  • 您确定没有一个底层表可以容纳所有这些表,这些表是临时创建的或作为视图本身创建的?如果没有基础表,这似乎是我见过的最糟糕的数据库设计!它需要添加假期的过程才能获得表创建权限,这在任何离开的生活中都是不可取的......也许找到更好的供应商:-)
  • 确实是无限智慧。不幸的是,我认为这里不能避免动态 SQL。

标签: sql-server sql-server-2012


【解决方案1】:

您可以使用一个表函数,该函数将在要识别的每个表中获得的值作为结果返回(您可以按月进行搜索)

我留下下面的例子:

CREATE FUNCTION [dbo].[ufnHolidays]()
RETURNS @holidays TABLE 
(
    id int
)
AS 
BEGIN

    /* example data
    CREATE TABLE #holiday_201802 (id int)
    CREATE TABLE #holiday_201803 (id int)
    CREATE TABLE #holiday_201804 (id int)

    INSERT #holiday_201802 VALUES (1)
    INSERT #holiday_201803 VALUES (2)
    INSERT #holiday_201804 VALUES (3)
    */

    IF OBJECT_ID('tempdb.dbo.#holiday_201802') IS NOT NULL
        INSERT @holidays
        SELECT id FROM #holiday_201802
    IF OBJECT_ID('tempdb.dbo.#holiday_201803') IS NOT NULL
        INSERT @holidays
        SELECT id FROM #holiday_201803
    IF OBJECT_ID('tempdb.dbo.#holiday_201804') IS NOT NULL
        INSERT @holidays
        SELECT id FROM #holiday_201804
    RETURN;
END;

GO

【讨论】:

  • 这可以防止表被删除,但这从来都不是问题,它需要客户每月手动调整。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-10-20
  • 2013-09-04
  • 1970-01-01
  • 2014-02-01
  • 1970-01-01
相关资源
最近更新 更多