在SELECT语句中使用参数化函数调用。 SQL Server

时间:2010-04-14 23:41:11

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

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

nDeptID是表Note中的一列。

SELECT STATEMENT:

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

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

提前致谢。

1 个答案:

答案 0 :(得分:7)

当你说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]

我很确定您的查询中的每个其他标量函数都适用。