2009-03-18 9 views
5

के साथ वैकल्पिक तालिका किसी अन्य तालिका (विभाग) की प्राथमिक कुंजी की डिफ़ॉल्ट बाधा के साथ एक तालिका (कर्मचारी) में एक कॉलम (MSSQL 2005) जोड़ने का प्रयास कर रहा हूं। तब मैं इस कॉलम को उस तालिका में एक एफके बनाने जा रहा हूं। अनिवार्य रूप से यदि कोई विभाग आईडी प्रदान नहीं किया जाता है तो यह विभाग के नाम के आधार पर नए कर्मचारियों को आधार विभाग को सौंपेगा।
यह काम नहीं करता है:प्रोग्रामेटिक रूप से निर्धारित निरंतर DEFAULT मान

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 

उत्पादन, परीक्षण और विकास डेटाबेस सिंक से बाहर हो गए और DepartmentName = 'RocketScience' के लिए DepartmentID या एक ही तो मैं नहीं करना चाहती नहीं हो सकता सिर्फ डेफॉल्ट (somenumber) कहने के लिए। मैं "तालिका तालिका कथन में वेरिएबल्स की अनुमति नहीं है" प्राप्त करना जारी रखता हूं इससे कोई फर्क नहीं पड़ता कि मैं किस तरह से समस्या पर हमला करता हूं।
ऐसा करने का सही तरीका क्या है? मैंने चयन कथन को घोंसले की कोशिश की है, जिसे "इस संदर्भ में सबक्वायरीज़ की अनुमति नहीं है। केवल अदिश भाव अनुमति दी जाती है। "

अलावा में, क्या वास्तव में महान मैं बजाय एक बयान में स्तंभ मान सकता है कर

{अशक्त परिवर्तन} {
मूल्यों अद्यतन}
होगा {रिक्त नहीं बदल}

कदम। मैंने VALUES कमांड के बारे में कुछ पढ़ा लेकिन इसे काम नहीं कर सका। धन्यवाद !!!

उत्तर

5

आप एक संग्रहीत समारोह में अपने विभाग आईडी लगाने के लिए कोड लपेट कर सकता है और अपने डिफ़ॉल्ट बाधा बयान में उपयोग करते हैं:

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()) 

कि मदद करता है?

मार्क

+0

मैं कोशिश करूँगा लेकिन मैंने सोचा था कि प्रलेखन कहा केवल प्रणाली कार्यों की अनुमति दी ... –

+0

कोशिश करो - मैंने किया था - (मेरे लिए काम किया एसक्यूएल सर्वर 2008 पर, कि है - लेकिन मैं यह 2005 के बीच बदल गया है संदेह और 2008) –

+0

मैं आपका जवाब स्वीकार करता हूं यह बहुत अच्छा काम करता है! –

8

स्वीकार किए जाते हैं जवाब महान (धन्यवाद marc_s) में काम किया लेकिन उसके बाद मैं थोड़ी देर के लिए इस बारे में सोचा था कि मैं एक और मार्ग जाने का फैसला किया।
मुख्य रूप से क्योंकि सर्वर पर एक फ़ंक्शन छोड़ा जाना चाहिए जो मुझे लगता है कि जब भी कर्मचारी जोड़ा जाता है तो उसे कॉल किया जाता है।
यदि कोई व्यक्ति बाद में फ़ंक्शन से गड़बड़ कर रहा है तो कोई भी कर्मचारी में प्रवेश नहीं कर सकता है और कारण स्पष्ट नहीं होगा। (भले ही यह सत्य नहीं है, फिर भी सर्वर पर अतिरिक्त फ़ंक्शंस हैं जिन्हें वहां होने की आवश्यकता नहीं है)

मैंने जो किया वह एक चर में गतिशील रूप से कमांड को इकट्ठा किया गया था और फिर EXECUTE कमांड का उपयोग करके कॉल किया गया था।

इतना ही नहीं, लेकिन चूंकि मैंने डिफ़ॉल्ट रूप से DEFAULT कीवर्ड का उपयोग नहीं किया था, इसलिए तालिका वापस आ गई थी और इसे पूरा करने के लिए मुझे एकाधिक आदेश चलाने की आवश्यकता नहीं थी। मैं भाग्य से पता चला कि एक ...

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 
2

आप स्तंभ जोड़ने के बाद अपने विदेशी कुंजी बाधा लागू हैं, तो आप जब तालिका में फेरबदल डिफ़ॉल्ट मान के लिए किसी भी मूल्य का उपयोग कर सकते हैं। फिर आप अपने परिवर्तनीय मान के साथ एक अद्यतन कथन चला सकते हैं।

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;