2010-04-14 2 views
3

이전 개발자로부터 일부 코드를 가져 왔으며 여러 SQL 함수를 호출하는이 SQL 문을 발견했습니다. 보시다시피 select 문에서 함수 호출은 함수에 매개 변수를 전달합니다. SQL 문은 변수를 대체 할 값을 어떻게 알 수 있습니까? 아래 예제에서 nDeptID를 호출 할 때 nDeptID를 바꿀 내용을 쿼리 엔진이 어떻게 알 수 있습니까? Note의 열입니다.SELECT 문에서 매개 변수화 된 함수 호출 사용. SQL 서버

SELECT 문 :

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 

을 ======= ===================

미리 감사드립니다.

답변

7

SELECT nDeptID FROM Note라고 말하면 열 값을 반환하는 방법과 동일한 방식입니다. 쿼리가 컴파일되고 이름이 메타 데이터에 바인딩되며 계획이 실행되고 결과가 수집됩니다.

하지만 아나 외주 결합에 대한 COALESCE 대신 스칼라 함수를 사용하는 것이 믿을 수 없을만큼 빨라질 것이라고 말하고 싶습니다. 이것은 절차 적 명령 형 C-derivat 언어가 아닌 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] 

나는 검색어의 모든 다른 스칼라 함수에 적용 같은 확신 해요.

+0

+1은 질문에 답할뿐만 아니라 유용한 조언을 제공합니다. – ig0774

+0

예, 성능이 매우 좋지 않아 현재이 코드 섹션을 다시 작성하고 있습니다. –

+0

쿼리가 37 개의 레코드를 반환하면 잠시 기다리면 쿼리의 각 함수가 37 번 호출됩니다. –

관련 문제