【问题标题】:Create dynamic sql statement based on the output of a select in sql server根据 sql server 中 select 的输出创建动态 sql 语句
【发布时间】:2014-07-10 13:52:29
【问题描述】:

我有一个函数可以获取任何日期并将其转换为不同年份的另一个日期(其目的是保留工作日、周数和月份,但这并不真正相关)。我用它来翻译日期列表并创建一个临时表,使用该函数将原始日期映射到映射日期。查询如下所示:

Select  InputDates.Date as InputDate, dbo.GetFutureDate(InputDates.Date,2012) as PastDate
        INTO #DateMap
        FROM InputDates

InputDates 是我需要翻译的日期列表。 dbo.GetFutureDate 是翻译函数。

正如您所见,年份是硬编码的,这就是我想要改变的。我在另一张表中有一个年份列表。我想创建一个动态 sql 语句,其中包含一系列 SELECT 语句,如上面的语句,根据我拥有的年份列表更改年份,然后使用 Union All 将它们组合在一起。

对我来说最好的方法是什么?

【问题讨论】:

    标签: sql sql-server sql-server-2008 date select


    【解决方案1】:

    选择 InputDates.Date 作为 InputDate,dbo.GetFutureDate(Date.Date,(select year from YourYearTable)) 作为 PastDate 进入#DateMap 从日期

    【讨论】:

    • 这只有在我选择一年时才有效,就像我这样做时选择 InputDates.Date as InputDate, dbo.GetFutureDate(Date.Date,(select Top 1 year from YourYearTable)) as PastDate INTO #DateMap FROM Dates 如果有多年,我会收到以下消息:子查询返回超过 1 个值。当子查询跟随 =、!=、、>= 或子查询用作表达式时,这是不允许的。
    【解决方案2】:

    希望我对你的理解是正确的,但是你为什么不创建一个与你拥有的年份列表的交叉连接,并将年份列表中的年份列传递给函数。

    Select  InputDates.Date as InputDate, dbo.GetFutureDate(InputDates.Date,YearInYearList) as PastDate
        INTO #DateMap
        FROM InputDates, YearList
    

    YearList 是包含年份的表名,YearInYearList 是表中的列名。这应该会产生您想要的结果,而不会产生 UNION 开销。

    【讨论】:

      【解决方案3】:

      您可以在 SQL Server 中使用 APPLY 运算符来实现您想要的。基本上,APPLY 运算符允许您从外部查询中引用列,并将其转换为联接或外部联接。

      例如:

      选择 y.year, t.* 进入#DateMap 从 y 年开始 交叉申请( 选择 InputDates.Date 作为 InputDate,dbo.GetFutureDate(InputDates.Date, y.year) 作为 PastDate FROM 输入日期 ) 作为 t

      有关 APPLY 运算符的更多详细信息,请参阅联机丛书。

      【讨论】:

        猜你喜欢
        • 2021-01-28
        • 2013-02-17
        • 1970-01-01
        • 1970-01-01
        • 2019-09-29
        • 1970-01-01
        • 2017-09-26
        • 2013-06-14
        • 1970-01-01
        相关资源
        最近更新 更多