MSSQL - La présentation des données lorsque les noms de colonnes dynamiques
-
09-09-2019 - |
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,
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.