문제

직원을위한 최종 권한 평가 점수를 발표하고 있습니다. 각 행은 직원의 데이터이며 평가할 범주는 기간마다 변경 될 수 있기 때문에 저장된 절차에서 열 이름을 하드 코딩 할 수 없습니다. 이미 다음 솔루션을 고안했습니다.

1 임시 테이블을 만듭니다
2 Alter Table 명령을 동적으로 사용하여 모든 해당 열을 추가합니다 (@ColumnNames에 저장)
3 커서 내부에 동적 SQL을 사용하여 올바른 점수를 얻는 각 직원에 대한 삽입물을 작성하십시오 (예 : 직원은 N 삽입을 의미합니다)

(SELECT @ECMScores = COALESCE(@ECMScores + ',', '') + CAST(EIS.ECMScore AS NVARCHAR(1000)) (FROM...))

SET @SQLString = ''

SET @SQLString = @SQLString + 'INSERT INTO      #ResultSet ('
SET @SQLString = @SQLString + 'EvaluationScoreID,'
SET @SQLString = @SQLString + 'EmployeeID,'
SET @SQLString = @SQLString + 'EmployeeName,'
SET @SQLString = @SQLString + @ColumnNames
SET @SQLString = @SQLString + ') '


SET @SQLString = @SQLString + 'VALUES ('
SET @SQLString = @SQLString + ''+CAST(@EvaluationScoreID AS NVARCHAR(MAX))+','
SET @SQLString = @SQLString + ''+CAST(@EmployeeID AS NVARCHAR(MAX))+','
SET @SQLString = @SQLString + '"'+@EmployeeName+'",'
SET @SQLString = @SQLString + @ECMScores
SET @SQLString = @SQLString + ')'

EXECUTE sp_executesql   @SQLString

문제는 100 명의 직원마다 약 1 초가 걸린다는 것입니다. 이것은 빨리 받아 들일 수 없게됩니다…

진행 방법에 대한 더 나은 아이디어가 있습니까? 커서를 제거하고 (명백히) 하나의 삽입 (아마도 선택)을 사용하는 것은 동적으로 생성 된 XML 변수에서 읽는 첫 번째 아이디어입니다.

감사,

도움이 되었습니까?

해결책

스키마에 데이터를 저장하지 마십시오

다음과 같은 테이블을 만듭니다.

Assignment
AssignmentID   int not null primary key identity(1,1)
AssignmentName varchar(50)  not null
AssignmentDate datetime not null
etc..

Score
ScoreID       int not null primary key identity(1,1)
EmployeeID    int not null
AssignmentID  int not null
ScoreValue    int not null

Employee
EmployeeID    int not null primary key identity(1,1)
EmployeeName  varhar(100) not null
etc..

이제 열이 항상 변경되므로 동적 쿼리를 구축하지 않고 "할당"을 만들고 "점수"를 삽입 할 수 있습니다. 이제 열이 동일하게 유지되고 데이터가 변경됩니다.

다른 팁

우선, 데이터베이스 구조를 변경할 수있는 기회가 있습니까? 내가 올바르게 이해하면 필드 eis.ecmscore 정규화 규칙을 위반하는 여러 값이 포함되어 있습니다. 나는 개인적으로 테이블을 재 설계 할 것입니다 EIS 작업을 훨씬 쉽게 만들 수 있으므로 정상화하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top