MSSQL - تقديم البيانات عند أسماء الأعمدة ديناميكية

StackOverflow https://stackoverflow.com/questions/747800

  •  09-09-2019
  •  | 
  •  

سؤال

أنا أشعر بعشرات تقييم السلطة النهائية للموظفين. كل صف عبارة عن بيانات موظف وبالتالي يمكن تقييم الفئات التي سيتم تقييمها من الفترة إلى الفترة ولا يمكن تصنيع أسماء الأعمدة في الإجراءات المخزنة. لقد ابتكرت بالفعل الحل التالي.

1 إنشاء جدول TEMP
2 استخدم ديناميكيا أمر ALTER TABLE لإضافة جميع الأعمدة المعمول بها (المخزنة في ColumnNames)
3 استخدم SQL ديناميكي داخل مؤشر لكتابة إدراج لكل موظف يحصل على الدرجات الصحيحة (أي الموظفين IE يعني إدراج 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 موظف. هذا يصبح بسرعة غير مقبولة ...

هل لدى أي شخص أي أفكار أفضل حول كيفية المضي قدما؟ إزالة المؤشر (من الواضح)، واستخدام إدراج واحد (ربما التحديد إلى) هو أول فكرتي ربما القراءة من متغير 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. يحتوي على قيم متعددة، والتي تنتهك قواعد التطبيع. أنا شخصيا سوف إعادة تصميم الجدول عظيم وتطبيعها، لأنها ستجعل مهمتك أسهل بكثير.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top