MSSQL - 在列名称动态时显示数据

时间:2009-04-14 14:19:07

标签: sql-server tsql dynamic-sql

我正在向员工提交最终权威评估分数。每行都是员工的数据,由于要评估的类别可能会在不同的时间段内发生变化,因此无法在存储过程中对列名进行硬编码。我已经设计了以下解决方案。

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秒钟。这很快变得不可接受......

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

谢谢,

2 个答案:

答案 0 :(得分: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..

您现在可以创建“分配”并插入“分数”,而无需构建动态查询,因为您的列始终会更改。您的列现在将保持不变,数据将会更改。

答案 1 :(得分:1)

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