MSSQL - 列名の動的なデータを提示
-
09-09-2019 - |
質問
私は従業員のための最終的な権限の評価点を提示しています。各行は、従業員のデータであり、カテゴリが評価されるので、列名は、ストアドプロシージャにハードコードすることができない期間ごとに変更することができます。私はすでに、次の解決策を考案しました。
1一時テーブルを作成します。
図2は、動的(@ColumnNamesに格納されている)
該当するすべての列を追加するには、ALTER TABLEコマンドを使用し
正しいスコアを取得し、各従業員のためのインサートを書き込むためのカーソル内部3を使用し、動的SQL(すなわち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秒を要しています。これはすぐに許容できなくなる...
誰もが続行する方法上の任意のより良いアイデアを持っていますか? (多分に選択)カーソルを(明らかに)の削除、および1つのインサートを使用することで、おそらく、動的に作成されたXML変数からの読み取り私の最初のアイデア...
おかげで、
解決
スキーマ内のデータを格納しません。
このようなテーブルを作成します:
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..
あなたは今、「割り当て」を作成し、列は常に変化するため、動的なクエリを構築することなく、「スコア」を挿入することができます。あなたの列は、今と同じままになり、データが変更されます。
他のヒント
まず第一に、あなたは、データベースの構造を変更する機会を持っているでしょうか?私が正しく理解していれば、フィールドのEIS.ECMScore のは、それが正規化ルールの違反だこれは、複数の値が含まれています。私は個人的にテーブルのEIS のを再設計し、それはあなたのタスクは、はるかに簡単になるだろうとして、それを正規化します。