Chr*_*Why 3 sql-server select sql-server-2005 function
我从前一个开发人员那里接过了一些代码,并遇到了这个调用多个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]
Run Code Online (Sandbox Code Playgroud)
======================
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
Run Code Online (Sandbox Code Playgroud)
==========================
提前致谢.
同样,它知道如何在你说的时候返回一个列值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]
Run Code Online (Sandbox Code Playgroud)
我很确定同样适用于查询中的每个其他标量函数.
| 归档时间: |
|
| 查看次数: |
33638 次 |
| 最近记录: |