【问题标题】:TSQL: Returned value of a function is the name of the columnTSQL:函数的返回值是列的名称
【发布时间】:2013-10-18 13:46:04
【问题描述】:

我有一个函数,它使用几种情况来查找当前周期返回一个 varchar(50),它是我需要的周期列。

我想对这个专栏做一个 SUM,但我不知道该怎么做。

例子:

Select SUM(ABS([dbo].[ACTUAL_PERIOD] ())) FROM Finance_DB

任何帮助都会很棒。

另外,您认为我应该首先使用该功能吗?基本上,它所做的只是通过 12 个案例陈述来确定我们通过查找另一个表格来确定我们所处的时期。起初我打算使用存储过程,但是呃......它不会返回任何东西。我之所以要使用它,是因为这个特殊的 case 语句在整个查询和所有其他查询中重复出现。它变得很长,我认为程序/函数看起来会更整洁。然而,在网上做了一些阅读后,我知道某些情况实际上并没有从函数中受益,而不是内联编写查询,它可能有多冗长。有什么想法吗?

【问题讨论】:

  • 虽然暗示这是SQL Server,但请在标签中加上。
  • 你能发布你当前函数的代码以及它是如何使用的吗?您想要实现的究竟是什么行不通?
  • 你想对 varchar 值求和吗?

标签: sql tsql function variables


【解决方案1】:

在这种情况下,您应该使用动态 SQL。 例如:

declare @SQL nvarchar(100);
select @SQL='Select SUM(ABS('+[dbo].[ACTUAL_PERIOD]()+')) FROM Finance_DB';
execute sp_executesql @SQL;

【讨论】:

  • 谢谢。虽然我试图避免动态化,但这很有效。
【解决方案2】:

如果我正确理解您的代码,您会在不同的列中获得句点值。

 Period1 Period2 Period3...   
   100      200     400
   130      250     300    

使用 unpivot 将列转换为行,使其看起来像

ColumnName Value
Period1    100
Period2    200
Period3    400
...

代码看起来像

WITH Values AS (
    SELECT ColumnName
          ,Value
    FROM Finance_DB
         UNPIVOT (Value FROM ColumnName IN (Period1, Period2,...)
)
SELECT SUM(ABS(Value))
FROM Values
WHERE ColumnName = Actual_Period();

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多