我正在向员工提交最终权威评估分数。每一行都是员工的数据,并且由于要评估的类别可以随时期而变化,因此列名不能在存储过程中硬编码。我已经设计了以下解决方案。
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>
谢谢,