Использование параметризованных вызовов функций в операторах SELECT. SQL Server - PullRequest
3 голосов
/ 15 апреля 2010

Я взял некоторый код от предыдущего разработчика и наткнулся на этот оператор 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

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

Заранее спасибо.

1 Ответ

7 голосов
/ 15 апреля 2010

Точно так же он знает, как вернуть значение столбца, когда вы говорите SELECT nDeptID FROM Note. Запрос скомпилирован, имена привязаны к метаданным, план выполнен, результаты получены.

Но я бы хотел сказать, что использование скалярной функции вместо COALESCE при внешнем соединении будет ужасным. Это SQL, а не процедурный обязательный производный язык.

Сделайте это вместо производительности:

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]

Я почти уверен, что то же самое относится ко всем другим скалярным функциям в вашем запросе.

...