我接管了以前开发人员的一些代码,并且遇到了调用多个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
==========================
提前致谢。
答案 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]
我很确定您的查询中的每个其他标量函数都适用。