سؤال

وأنا أحاول أن إضافة عمود (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;
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top