2009-10-14 2 views
0

데이터베이스의 여러 테이블에있는 행에 대해 여러 가지 유효성 검사를 수행하는 작업이 있습니다. 검사가 실패하면 테이블에 실패를 기록합니다. 로깅되는 정보에는 테이블 이름, 실패한 행의 uniqueidentifier 값, 실패 확인 및 해당 시점에 실행중인 작업이 포함됩니다. 여기에 로그 내가 어떤 테이블에서는 jobID을 부여 실패한 행의 수를 반환하는 함수를 작성하고 싶습니다함수에서 결과 집합의 행 수를 반환하는 TSQL 함수

CREATE TABLE [tblSY_ValidationFieldFailures](
    [pkValidationFieldFailure] [int] IDENTITY(1,1) NOT NULL, 
    [fkJobID] [int] NOT NULL, 
    [fkValidationFieldFailureType] [int] NOT NULL, 
    [TableName] nvarchar(128), 
    [TableUniqueIdentifier] [nvarchar](100) NULL) 

(즉 fnGetNumberOfFailedRows (@JobID, @tablename))의 단순화 된 테이블 정의입니다. 나는 다음과 비슷한 것을 시도했다.

물론 함수 내에서 Select 문을 사용할 수 없다. 함수 내부에서 원하는 것을 수행 할 수있는 방법이 있습니까? 아니면 저장 프로 시저 경로를 사용해야합니까?

답변

3

이 당신을 위해 그것을 수행해야합니다

CREATE FUNCTION fnGetNumberOfRowsThatFailedValidationCheck 
    ( 
    @pkJobID int,  
    @TableName nvarchar(128) 
    ) 
RETURNS int 
AS 

BEGIN 

-- Declare the return variable here 
DECLARE @NumFailedRows int 

SELECT @NumFailedRows = count(*) 
FROM (
    Select 
     fkJobID,    
     TableUniqueIdentifier,    
     TableName 
    From tblSY_ValidationFieldFailures  
    Where [email protected] 
    And [email protected] 
    Group By fkJobID, TableName, TableUniqueIdentifier 
    ) a 

RETURN @NumFailedRows 

END 
+0

감사합니다. 별칭을 사용하지 않고 이것을 시도한 후에 구문 오류가 발생했습니다. 왜 마지막에 a가 필요한지 아십니까? –

+0

기꺼이 도와 드리겠습니다. 왜 모든 필드가 정규화 될 수 있어야한다는 것을 제외하고 별칭이 필요한지 정확하게 말할 수는 없습니다 (대부분 엔진이 이것을 처리합니다). 그리고 파생 된 이름 table/resultset, 참조 된 필드의 소스 이름이 없습니다. 그래도 추측. –

4

당신은 당신의 선택에 카운트 (*) 문을 사용하고 같은 제대로 그를 지정할 수 있습니다 :

CREATE FUNCTION fnGetNumberOfRowsThatFailedValidationCheck 
(
    @pkJobID int, 
    @TableName nvarchar(128) 
) 
RETURNS int 
AS 
BEGIN 
-- Declare the return variable here 
DECLARE @NumFailedRows int 

Select @NumFailedRows = count(*) 
From tblSY_ValidationFieldFailures 
    Where [email protected] And [email protected] 
       Group By fkJobID, TableName, TableUniqueIdentifier 

--SET @NumFailedRows = @@ROWCOUNT 

RETURN @NumFailedRows  
END 
+0

; 예 : UniqueIdentifier가 1이고 fkJobID가 1이고 TableName이 'table1'이고 행이 실패한 경우 fkValidationFieldFailureType 1, 6 및 7 Count (*)는 3을 반환합니다. 기본적으로 테스트를 통과하지 못한 각 행의 수를 반환합니다. –

+0

COUNT (*)가 각 그룹 내의 카운트가 아닌 그룹의 카운트가되도록 랩핑하십시오. –

1

SQL Server 2008에서는 나중에 COUNT (*) OVER()를 쿼리의 열 이름 중 하나로 추가하면 반환 된 전체 행이 채워집니다. 매 행마다 반복되지만 최소한 값을 사용할 수 있습니다. 많은 다른 솔루션이 작동하지 않는 이유는 매우 큰 결과 세트의 경우 많은 경우에 실용적이지 않은 모든 행을 반복 할 때까지 (특히 순차 처리 솔루션) 합계를 알 수 없기 때문입니다. 이 기술은 예를 들어 첫 번째 IDataReader.Read()를 호출 한 후 총 개수를 제공합니다.

선택 COUNT (*) OVER() TOTAL_ROWS로, ... ...에서

단지 나에게 특정 행이 실패 얼마나 많은 다른 테스트의 수를 줄 것이다 불행하게도
관련 문제