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