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>

有没有人对如何进行有更好的想法?删除光标(显然),并使用一个插入(也许选择进入)是我的第一个想法,也许是从动态创建的 XML 变量中读取......</p>

谢谢,

4

2 回答 2

3

不要将数据存储在架构中

创建这样的表:

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

您现在可以创建“作业”并插入“分数”,而无需构建动态查询,因为您的列总是会发生变化。您的列现在将保持不变,数据将发生变化。

于 2009-04-14T15:02:45.700 回答
1

首先,你有机会改变数据库结构吗?如果我理解正确,字段EIS.ECMScore包含多个值,这违反了规范化规则。我个人会重新设计表EIS并对其进行规范化,因为它会使您的任务更容易。

于 2009-04-14T14:37:10.207 回答