Question

Je suis présenter à un score final d'évaluation de l'autorité pour les employés. Chaque ligne est des données d'un employé et que les catégories à évaluer peuvent changer d'une période à les noms de colonnes ne peuvent pas être dans les procédures codées en dur stockées. Je l'ai déjà mis au point la solution suivante.
1 Créer une table temporaire
2 Utilisez la commande Dynamiquement alter table pour ajouter toutes les colonnes applicables (stockées dans @ColumnNames)
3 Utiliser SQL dynamique dans un curseur pour écrire un insert pour chaque employé qui obtient les bonnes réponses (employés IE N signifie que les inserts 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

Le problème est qu'il faut environ 1 seconde pour 100 employés. Ce devient rapidement inacceptable ...

Quelqu'un at-il une meilleure idée sur la façon de procéder? Retrait du curseur (évidemment), et en utilisant un insert (Peut-être Sélectionnez dans) est ma première idée lecture peut-être d'une variable XML dynamique créée ...

Merci,

Était-ce utile?

La solution

ne pas stocker des données dans le schéma

créer des tables comme ceci:

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..

vous pouvez maintenant créer des « missions » et insérer « scores » sans créer des requêtes dynamiques parce que vos colonnes changent toujours. vos colonnes maintenant restent les mêmes et les données changeront.

Autres conseils

Tout d'abord, auriez-vous la possibilité de modifier la structure de base de données? Si je comprends bien, champ EIS.ECMScore contient plusieurs valeurs, qu'il est une violation des règles de normalisation. Personnellement, je redessiner la table EIS et normaliser, car cela rendrait la tâche beaucoup plus facile.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top