MSSQL - Presentando i dati quando i nomi di colonna dinamica
-
09-09-2019 - |
Domanda
che vi presento un finale i punteggi di valutazione l'autorità per i dipendenti. Ogni riga è i dati di un dipendente e dato che le categorie da valutare può cambiare da periodo a periodo i nomi delle colonne non possono essere hardcoded nelle stored procedure. Ho già messo a punto la seguente soluzione.
1 Creare una tabella temporanea
2 dinamicamente utilizzare il comando ALTER TABLE per aggiungere tutte le colonne applicabili (memorizzato in @ColumnNames)
3 Utilizzare SQL dinamico all'interno di un cursore di scrivere un inserto per ogni dipendente che ottiene i punteggi corretti (dipendenti IE N significa inserti 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
Il problema è che ci vuole circa 1 secondo per ogni 100 dipendenti. Questo diventa rapidamente inaccettabile ...
Qualcuno ha qualche idea migliore su come procedere? Rimozione del cursore (ovviamente), e l'utilizzo di un inserto (Forse Selezionare in) è la mia prima idea, forse la lettura da una variabile XML creato in modo dinamico ...
Grazie,
Soluzione
non conservare i dati nello schema
creare tabelle come questo:
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..
ora è possibile creare "assegnazioni" e inserire "punteggi" senza costruire query dinamiche perché il vostro colonne cambiano sempre. le colonne ora rimanere lo stesso ei dati cambieranno.
Altri suggerimenti
Prima di tutto, vuoi avere la possibilità di modificare la struttura del database? Se ho capito bene, campo EIS.ECMScore contiene più valori, che si tratta di una violazione delle regole di normalizzazione. Personalmente mi ridisegnare tabella EIS e normalizzare esso, in quanto renderebbe il vostro compito molto più facile.