تغيير الجدول مع مصممة برمجيا قيمة DEFAULT ثابتة
-
20-08-2019 - |
سؤال
وأنا أحاول أن إضافة عمود (MSSQL 2005) إلى جدول (موظف) مع القيد الافتراضي من مفتاح أساسي من جدول آخر (وزارة). ثم انا ذاهب لجعل هذا العمود FK إلى هذا الجدول. أساسا هذا سوف تعيين الموظفين الجدد إلى إدارة قاعدة القائم قبالة اسم الدائرة إذا لم يتم توفير DepartmentID.
هذا لا يعمل:
DECLARE @ErrorVar INT
DECLARE @DepartmentID INT
SELECT @DepartmentID = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
ALTER TABLE [Employee]
ADD [DepartmentID] INT NULL
CONSTRAINT [DepartmentIDOfAssociate] DEFAULT (@DepartmentIDAssociate)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
GOTO FATAL_EXIT
END
والإنتاج، والاختبار، وقواعد البيانات تطوير نمت من التوافق وDepartmentID لDepartmentName = 'RocketScience "قد أو قد لا تكون هي نفسها لذلك أنا لا أريد أن أقول فقط DEFAULT (somenumber). وأظل الحصول على "لا يسمح المتغيرات في بيان TABLE ALTER" بغض النظر عن الطريقة I مهاجمة المشكلة.
ما هي الطريقة الصحيحة للقيام بذلك؟ لقد حاولت أن تعشش حدد البيان وكذلك التي يحصل "لا يسمح الاستعلامات الفرعية في هذا السياق. يسمح فقط تعبيرات العددية ".
بالإضافة إلى ذلك، ما سيكون أمرا رائعا حقا ويمكنني أن نشر قيم العمود في عبارة واحدة بدلا من القيام
{ALTER باطل} {
القيم تحديث} {
ALTER لا باطل}
الخطوات. قرأت شيئا عن ذات القيم الأوامر ولكن لم يتمكنوا من الحصول على عمل.
بفضل!
المحلول
هل يمكن أن التفاف رمز للعثور على ID قسم الخاص بك إلى وظيفة تخزين واستخدام ذلك في بيان DEFAULT القيد الخاص بك:
CREATE FUNCTION dbo.GetDepartment()
RETURNS INT
AS
BEGIN
DECLARE @DepartmentID INT
SELECT @DepartmentID = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
RETURN @DepartmentID
END
وبعد ذلك:
ALTER TABLE [Employee]
ADD [DepartmentID] INT NULL
CONSTRAINT [DepartmentIDOfAssociate] DEFAULT (dbo.GetDepartment())
هل تساعد؟
ومارك
نصائح أخرى
والجواب المقبول عملت كبيرة (marc_s شكرا) ولكن بعد أن فكرت في ذلك لبعض الوقت قررت أن أذهب طريقا آخر.
ويرجع ذلك أساسا يجب أن يكون هناك وظيفة تركت على الخادم الذي أعتقد أنه انتهى الامر بتسمية في كل مرة يضاف موظف.
اذا كان شخص ما افسدت مع وظيفة في وقت لاحق ثم لا يمكن لأحد أن يدخل موظف وان السبب لا يكون واضحا.
(حتى لو كان هذا ليس صحيحا ثم لا تزال هناك وظائف اضافية على الخادم التي لا تحتاج إلى أن تكون هناك)
ما فعلته كان التجمع الأمر حيوي في متغير ثم نسمي ذلك باستخدام الأمر تنفيذ.
وليس هذا فقط ولكن منذ أن استخدمت الكلمة DEFAULT مع NOT NULL الجدول وقد ظهر بالسكان وأنا لم يكن لديك لتشغيل عدة أوامر لانجاز ذلك. لقد وجدت أن واحدا من الحظ ...
DECLARE @ErrorVar INT
DECLARE @DepartmentIDRocketScience INT
DECLARE @ExecuteString NVARCHAR(MAX)
SELECT @DepartmentIDRocketScience = DepartmentID
FROM Department
WHERE RealName = 'RocketScience'
SET @ExecuteString = ''
SET @ExecuteString = @ExecuteString + 'ALTER TABLE [Employee] '
SET @ExecuteString = @ExecuteString + 'ADD [DepartmentID] INT NOT NULL '
SET @ExecuteString = @ExecuteString + 'CONSTRAINT [DF_DepartmentID_RocketScienceDepartmentID] DEFAULT ' +CAST(@DepartmentIDAssociate AS NVARCHAR(MAX))
EXECUTE (@ExecuteString)
SELECT @ErrorVar = @@Error
IF (@ErrorVar <> 0)
BEGIN
GOTO FATAL_EXIT
END
إذا قمت بتطبيق قيد مفتاح خارجي بعد إضافة العمود، يمكنك استخدام أي قيمة للقيمة الافتراضية عند تغيير الجدول. ثم يمكنك تشغيل عبارة تحديث مع قيمة المتغير الخاص بك.
ALTER TABLE Employee
ADD DepartmentID INT NOT NULL
Default -1;
UPDATE Employee
SET Employee.DepartmentID = @DepartmentID
WHERE DepartmentID = -1;
ALTER TABLE Employee
ADD CONSTRAINT fk_employee_to_department FOREIGN KEY (DepartmentID)
REFERENCES Department;