MSSQL - Представление данных, когда имена столбцов динамические - PullRequest
0 голосов
/ 14 апреля 2009

Я представляю итоговые оценки авторитетным сотрудникам. Каждая строка представляет собой данные сотрудника, и поскольку оцениваемые категории могут меняться от периода к периоду, имена столбцов не могут быть жестко закодированы в хранимых процедурах. Я уже разработал следующее решение.

1 Создайте временную таблицу
2 Динамически используйте команду «Изменить таблицу» для добавления всех применимых столбцов (хранится в @ColumnNames)
3 Используйте динамический SQL внутри курсора, чтобы написать вставку для каждого сотрудника, которая получает правильные оценки (IE N employee означает 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 секунда. Это быстро становится неприемлемым ...

У кого-нибудь есть идеи получше? Удаление курсора (очевидно) и использование одной вставки (возможно, «Выбрать в») - моя первая идея, возможно, чтение из динамически создаваемой переменной XML…

Спасибо

Ответы [ 2 ]

3 голосов
/ 14 апреля 2009

не хранить данные в схеме

создать таблицы, подобные этой:

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 голос
/ 14 апреля 2009

Прежде всего, у вас будет возможность изменить структуру базы данных? Если я правильно понимаю, поле EIS.ECMScore содержит несколько значений, что является нарушением правил нормализации. Я лично перепроектировал бы таблицу EIS и нормализовал бы ее, поскольку это сделало бы вашу задачу намного легче.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...