0

従業員の最終権限評価スコアを提示しています。各行は従業員のデータであり、評価されるカテゴリは期間ごとに変わる可能性があるため、ストアド プロシージャで列名をハードコーディングすることはできません。私はすでに次の解決策を考案しました。

1 一時テーブルを作成する
2 Alter Table コマンドを動的に使用して、該当するすべての列を追加する (@ColumnNames に格納される)
3 カーソル内で動的 SQL を使用して、正しいスコアを取得する各従業員の挿入を書き込む (IE N の従業員は 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

問題は、100 人の従業員ごとに約 1 秒かかることです。これはすぐに受け入れられなくなります…</p>

続行する方法について、より良いアイデアを持っている人はいますか? カーソルを (明らかに) 削除し、1 つの挿入 (おそらく Select into) を使用することは、おそらく動的に作成された XML 変数から読み取る最初のアイデアです…</p>

ありがとう、

4

2 に答える 2

1

まず、データベース構造を変更する機会はありますか? 私の理解が正しければ、フィールドEIS.ECMScoreには複数の値が含まれており、これは正規化規則に違反しています。個人的には、テーブルEISを再設計して正規化します。これにより、タスクがはるかに簡単になります。

于 2009-04-14T14:37:10.207 に答える