Pregunta

Me presento a una puntuación final de evaluación autoridad para los empleados. Cada fila de datos es de un empleado y puesto que las categorías a ser evaluada puede cambiar de un período a los nombres de columna no pueden ser codificados en los procedimientos almacenados. Ya he ideado la siguiente solución.
1 Crear una tabla temporal
2 Use dinámicamente el comando ALTER TABLE para agregar todas las columnas aplicables (Almacenado en @ColumnNames)
3 Uso de SQL dinámico dentro de un cursor para escribir una inserción para cada empleado que obtiene los resultados correctos (es decir, n significa los empleados N inserciones)

(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

El problema es que tarda aproximadamente 1 segundo por cada 100 empleados. Esto se convierte rápidamente inaceptable ...

¿Alguien tiene alguna idea mejor sobre cómo proceder? Extracción del cursor (obviamente), y el uso de una inserción (Tal vez en Seleccionar) es mi primera idea tal vez la lectura de una variable XML creado de forma dinámica ...

Gracias,

¿Fue útil?

Solución

no almacene los datos en el esquema

crear tablas como la siguiente:

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

Ahora puede crear "tareas" e insertar "puntuaciones" sin necesidad de construir consultas dinámicas porque su columnas siempre cambian. sus columnas ahora serán los mismos y los datos van a cambiar.

Otros consejos

En primer lugar, ¿tendría la oportunidad de modificar la estructura de base de datos? Si he entendido bien, el campo EIS.ECMScore contiene varios valores, que se trata de una violación de las reglas de normalización. Yo personalmente rediseñar la tabla EIS y normalizarla, ya que haría que su tarea mucho más fácil.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top