2009-04-14 3 views
0

Ich präsentiere zu einer endgültigen Autorität Bewertungsnoten für Mitarbeiter. Bei jeder Zeile handelt es sich um die Daten eines Mitarbeiters, und da die zu bewertenden Kategorien sich von Periode zu Periode ändern können, können die Spaltennamen in den Stored Procedures nicht fest codiert werden. Ich habe bereits die folgende Lösung entwickelt.

1 Erstellen Sie eine temporäre Tabelle
2 Dynamisch das Alter Table-Befehl verwenden, um alle anwendbaren Spalten (Stored in @ColumnNames)
3 Verwenden Sie dynamische SQL in einem Cursor hinzuzufügen, einen Einsatz für jeden Mitarbeiter zu schreiben, die die richtigen Noten bekommt (IE N Mitarbeiter bedeutet N Einsätze)
MSSQL - Präsentieren von Daten, wenn die Spaltennamen dynamisch sind

(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 + '"'[email protected]+'",' 
SET @SQLString = @SQLString + @ECMScores 
SET @SQLString = @SQLString + ')' 

EXECUTE sp_executesql @SQLString 

Das Problem ist es ca. 1 Sekunde für alle 100 Mitarbeiter übernimmt. Dies wird schnell inakzeptabel ...

Hat jemand bessere Ideen, wie es weitergehen soll? Entfernen Sie die Cursor (natürlich), und mit einem Einsatz (Vielleicht in Auswahl) vielleicht meine erste Idee ist aus einer dynamisch erzeugten XML-Variable lesen ...

Danke,

Antwort

3

speichern keine Daten im Schema

Erstellen von Tabellen wie folgt aus:

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

Sie können nun „Zuweisungen“ erstellen und „scores“ einfügen, ohne den Aufbau dynamische Abfragen, weil Ihre Spalten immer ändern. Ihre Spalten bleiben jetzt gleich und die Daten ändern sich.

1

Zunächst einmal würden Sie haben die Möglichkeit, zu verändern die Datenbankstruktur? Wenn ich richtig verstehe, enthält das Feld EIS.ECMScore mehrere Werte, was eine Verletzung der Normalisierungsregeln darstellt. Ich persönlich würde Tabelle EIS umgestalten und es normalisieren, da es Ihre Aufgabe viel einfacher machen würde.

Verwandte Themen