【问题标题】:Using parameterized function calls in SELECT statements. SQL Server在 SELECT 语句中使用参数化函数调用。 SQL 服务器
【发布时间】:2011-02-08 03:59:38
【问题描述】:

我从以前的开发人员那里接手了一些代码,并且遇到了这个调用多个 SQL 函数的 SQL 语句。如您所见,select 语句中的函数调用将参数传递给函数。 SQL 语句如何知道用什么值替换变量?对于下面的示例,查询引擎如何知道在调用时用什么替换 nDeptID,fn_SelDeptName_DeptID(nDeptID)

nDeptID是表Note中的一列。

选择语句:

SELECT nCustomerID AS [Customer ID], 
 nJobID AS [Job ID], 
 dbo.fn_SelDeptName_DeptID(nDeptID) AS Department, 
 nJobTaskID AS JobTaskID, 
 dbo.fn_SelDeptTaskDesc_OpenTask(nJobID, nJobTaskID) AS Task, 
 nStandardNoteID AS StandardNoteID, 
 dbo.fn_SelNoteTypeDesc(nNoteID) AS [Note Type], 
 dbo.fn_SelGPAStandardNote(nStandardNoteID) AS [Standard Note], 
 nEntryDate AS [Entry Date], 
 nUserName as [Added By], 
 nType AS Type, 
 nNote AS Note FROM Note 
 WHERE nJobID = 844261 
 ORDER BY nJobID, Task, [Entry Date]

=======================

Function fn_SelDeptName_DeptID:

ALTER FUNCTION [dbo].[fn_SelDeptName_DeptID] (@iDeptID int)
RETURNS varchar(25)

-- Used by DataCollection for Job Tracking
-- if the Deptartment isnt found return an empty string

BEGIN 
 -- Return the Department name for the given DeptID.
 DECLARE @strDeptName varchar(25)

 IF @iDeptID = 0 
  SET @strDeptName = ''

 ELSE
 BEGIN
  SET @strDeptName = (SELECT dName FROM Department WHERE dDeptID = @iDeptID)
  IF (@strDeptName IS NULL) SET @strDeptName = ''
 END

 RETURN @strDeptName

END

===========================

提前致谢。

【问题讨论】:

    标签: sql-server sql-server-2005 select function


    【解决方案1】:

    当你说SELECT nDeptID FROM Note 时,它知道如何返回列值。查询编译,名称绑定元数据,执行计划,获取结果。

    但我想指出,在外连接上使用标量函数而不是 COALESCE 会让人难以置信。这是 SQL,而不是程序命令式的普通 C 派生语言。

    为了性能,请改为这样做:

    SELECT nCustomerID AS [Customer ID], 
     nJobID AS [Job ID], 
     COALESCE(d.Name, "") AS Department, 
     ...
     FROM Note 
     LEFT JOIN Departments d ON Note.nDeptID = d.nDeptID
     WHERE nJobID = 844261 
     xORDER BY nJobID, Task, [Entry Date]
    

    我很确定这同样适用于您查询中的所有其他标量函数。

    【讨论】:

    • +1 不仅可以回答问题,还可以提供有用的建议
    • 是的,目前性能很差,这就是我重写这部分代码的原因。
    • 等一下,如果查询返回37条记录,那么查询中的每个函数都被调用了37次?!
    • @geekzlla - 正确。如果您在 SELECT 子句中放置一个函数,它将为输出中的每一行执行(取决于函数的类型。但使用您的示例......)。因此,函数执行的数量将等于使用函数调用的列数乘以输出中的行数。
    • @Remus - 足够公平(并且有效)。但是 真正 ANSI 兼容的 SQL 很少与“为我的目标平台优化”兼容。相反,甚至。很遗憾。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-15
    • 1970-01-01
    • 1970-01-01
    • 2015-06-03
    • 2013-11-02
    相关资源
    最近更新 更多