我呈现给最终权威的评价分值为员工。每一行都是员工的数据,自类别进行评估可以不同期间的列名不能在存储过程中被硬编码改变。我已经设计了以下解决方案。搜索结果 1.创建一个临时表结果 2动态使用ALTER TABLE命令添加所有适用的列(保存在@ColumnNames),点击 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

问题是,它需要大约1秒每100名员工。这很快变得不可接受...

有没有人对如何进行更好的想法?删除光标(明显),并用一个刀片(也许SELECT INTO)是我的第一个想法可能是从一个动态创建的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 的和规范它,因为它会使你的工作更加容易。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top