【问题标题】:How to pass column value as a function parameter ? SQL Server 2005如何将列值作为函数参数传递? SQL Server 2005
【发布时间】:2023-03-21 06:44:01
【问题描述】:

我是新来的,所以请放轻松。如何将列值作为函数参数传递?

我有这个查询来选择月份和年份:

 SELECT 
     DATEPART(MONTH, a.RequestDate), 
     DATEPART(YEAR, a.RequestDate) 
 FROM 
     TABLE A

样本数据:

Months  Years 
------  -----
  5     2013
  3     2013
  1     2013
  9     2013

值不按顺序排列,可能重复。

我想自动将这些值一一传递给函数参数:

 SELECT WeekNo 
 FROM   _GLOBALDB.dbo.fn_WeekNoListInMonth(a.Months, a.Years)

结果将显示该特定月份的周数。例如:

 SELECT MIN(WeekNo) 
 FROM   fn_WeekNoListInMonth(5, 2013)

预期结果:

 WeekNO
 ------
   18
   19
   20
   21

我试过了:

 SELECT MIN(WeekNo) 
 FROM fn_WeekNoListInMonth(A.Months, A.Years)

但它显示错误:

无法绑定多部分标识符“A.Months”。
无法绑定多部分标识符“t.Months”。

【问题讨论】:

  • 那么,您想为A 中的每一行获取fn_WeekNoListInMonth() 的所有输出吗?那么,如果 A 中有 10 行,你会得到 40 到 50 行吗?或者您是否需要从函数的输出中获取“A”中的每一行的最小值?
  • @Ann L. 所有输出。如果我想获得最低或最高,我只需为最低添加“Min”,为最高添加“max”,对吗?
  • 遗憾的是,您使用的是 SQL 2005 ——使用 SQL 2008,这变得容易多了。我正在努力记住我们之前做过的事情。
  • (如果您不尝试获取最高值或最低值,为什么MIN 出现在问题中?)
  • 我的印象是这个结果不会是最终结果。你希望得到什么信息?也许我们可以避免做这个(我记得的)不合理的困难的事情。

标签: sql sql-server-2005


【解决方案1】:

您应该可以在 SQL Server 2005 中使用cross apply:

SELECT . . .
FROM TABLE A CROSS APPLY
     dbo.fn_WeekNoListInMonth(month(a.RequestDate), year(a.RequestDate))

【讨论】:

  • 是的,你是对的。我记得CROSS APPLY 是在 2008 年推出的,但我认为那是因为我工作的雇主从 SQL Server 2000 跳到了 SQL Server 2008。
  • 输出不是我想要的,它输出随机数并输出 2 列,而 fn_weekListInMonth 函数仅输出 1 列
  • @jonathan 。 . .这解决了您的问题似乎是:“我想将这些值一个一个地自动传递给函数参数:”。如果查询的其余部分不能满足您的要求,请提出另一个问题。
【解决方案2】:
;with cte as ( 
SELECT DATEPART(MONTH, RequestDate) as Months, DATEPART(YEAR, RequestDate) as Years
 FROM TABLE 
 )
SELECT WeekNO  FROM cte A 
CROSS APPLY dbo.fn_WeekNoListInMonth(month(A.Months, A.Years)

【讨论】:

  • 虽然这可能会回答作者的问题,但它缺少一些解释性文字和/或文档链接。如果没有围绕它们的一些短语,原始代码 sn-ps 并不是很有帮助。您可能还会发现how to write a good answer 非常有帮助。请编辑您的答案。
猜你喜欢
  • 2020-08-03
  • 2016-04-16
  • 1970-01-01
  • 1970-01-01
  • 2012-06-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-05-19
相关资源
最近更新 更多