SQL सर्वर में, आप sp_rename
. का उपयोग कर सकते हैं किसी स्तंभ सहित किसी ऑब्जेक्ट का नाम बदलने के लिए संग्रहीत कार्यविधि।
उदाहरण
प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है:
EXEC sp_rename 't1.c1', 'c11';
यह c1
. नामक कॉलम का नाम बदल देता है (t1
. में टेबल) से c11
. तक ।
ऑब्जेक्ट प्रकार सहित
आप ऑब्जेक्ट प्रकार को तीसरे तर्क के रूप में भी शामिल कर सकते हैं। इस मामले में, हम COLUMN
. का उपयोग कर सकते हैं :
EXEC sp_rename 'dbo.t1.c11', 'c1', 'COLUMN';
स्कीमा नाम सहित
आप स्कीमा नाम के साथ पहले कॉलम को भी क्वालिफाई कर सकते हैं, इस स्थिति में, यह कुछ इस तरह दिख सकता है:
EXEC sp_rename 'dbo.t1.c1', 'c11', 'COLUMN';
इस उदाहरण में, dbo
स्कीमा नाम है, लेकिन आपको जो भी स्कीमा लागू हो उसका उपयोग करना होगा।
पैरामीटर नामों सहित
किसी भी संग्रहीत कार्यविधि की तरह, sp_rename
. को कॉल करते समय आप पैरामीटर नाम भी शामिल कर सकते हैं :
EXEC sp_rename
@objname = 'dbo.t1.c1',
@newname = 'c11',
@objtype = 'COLUMN';
संदर्भों की जांच करें
जब आप SQL सर्वर में किसी कॉलम का नाम बदलते हैं, तो आपको शायद इस तरह का एक संदेश दिखाई देगा:
Caution: Changing any part of an object name could break scripts and stored procedures.
ऐसा इसलिए है क्योंकि जब आप किसी कॉलम का नाम बदलते हैं, तो SQL सर्वर नहीं करता है स्वचालित रूप से उस कॉलम के किसी भी संदर्भ का नाम बदलें। जब आप किसी तालिका का नाम बदलते हैं तो यह भी सच होता है।
उपरोक्त चेतावनी संदेश के बावजूद, वैसे भी कॉलम का नाम बदल दिया गया है।
यदि हम किसी ऐसे दृश्य को क्वेरी करने का प्रयास करते हैं जो बदले हुए कॉलम को संदर्भित करता है, तो हमें एक त्रुटि मिलती है।
SELECT * FROM vt1;
परिणाम:
Msg 207, Level 16, State 1, Procedure vt1, Line 2 Invalid column name 'c1'. Msg 4413, Level 16, State 1, Line 1 Could not use view or function 'vt1' because of binding errors.
यह दृश्य c1
. को संदर्भित करने का प्रयास कर रहा है लेकिन उस कॉलम का नाम बदल दिया गया है, और इसलिए तालिका में उस नाम के साथ कोई कॉलम नहीं है।
इस दृश्य की परिभाषा इस तरह दिखती है:
CREATE VIEW vt1 AS
SELECT c1, c2 FROM dbo.t1;
नए कॉलम नाम को संदर्भित करने के लिए हमें इस दृश्य को अपडेट करना होगा। तो हम यह कर सकते हैं:
ALTER VIEW vt1 AS
SELECT c11, c2 FROM dbo.t1;
अब दृश्य को क्वेरी करने से सही डेटा वापस आ जाएगा।
इसलिए, किसी भी कॉलम का नाम बदलने से पहले, आपको हमेशा उस कॉलम को संदर्भित करने वाली स्क्रिप्ट और संग्रहीत कार्यविधियों की जांच करनी चाहिए। नए कॉलम नाम को संदर्भित करने के लिए आपको ऐसी स्क्रिप्ट और प्रक्रियाओं को अपडेट करना होगा।
आप sys.sql_expression_dependencies
. का उपयोग कर सकते हैं यह जाँच करने के लिए सिस्टम कैटलॉग दृश्य।
गणना किए गए स्तंभों का नाम बदलना
SQL सर्वर हमें गणना किए गए कॉलम का नाम बदलने नहीं देता है।
यदि आप किसी परिकलित स्तंभ का नाम बदलने का प्रयास करते हैं, तो संभवतः आपको निम्न त्रुटि संदेश दिखाई देगा।
EXEC sp_rename 'dbo.t1.c3', 'c13', 'COLUMN';
परिणाम:
Caution: Changing any part of an object name could break scripts and stored procedures. Msg 4928, Level 16, State 1, Procedure sp_rename, Line 689 Cannot alter column 'c3' because it is 'COMPUTED'.
इस मामले में, c3
कॉलम एक परिकलित कॉलम है जो c2
. में एक मान के आधार पर गणना करता है कॉलम।
जब हम c2
. का नाम बदलने का प्रयास करते हैं तो यहां क्या होता है कॉलम।
EXEC sp_rename 'dbo.t1.c2', 'c12', 'COLUMN';
परिणाम:
Msg 15336, Level 16, State 1, Procedure sp_rename, Line 563 Object 'dbo.t1.c2' cannot be renamed because the object participates in enforced dependencies.
हमें इस कॉलम के लिए एक अलग त्रुटि मिलती है। यह त्रुटि इसलिए है क्योंकि परिकलित कॉलम इस कॉलम पर निर्भर करता है।
मूल रूप से, गणना किए गए कॉलम का नाम बदलने के लिए, हमें इसे छोड़ना होगा और इसे फिर से जोड़ना होगा।
उदाहरण:
ALTER TABLE t1
DROP COLUMN c3;
ALTER TABLE t1
ADD c13 AS c2 * 10;
विदेशी कुंजी
प्राथमिक कुंजी कॉलम का नाम बदलने से उस कॉलम को संदर्भित करने वाली कोई भी विदेशी कुंजी नहीं टूटती है।
उदाहरण के लिए, मैंने t1.c1
. का नाम बदलने से पहले से t1.c11
, हालांकि मैंने इसका उल्लेख नहीं किया, मेरे पास वास्तव में एक और टेबल और कॉलम था (t2.c2
) जो t1.c1
. को संदर्भित करता है ।
t1.c1
. का नाम बदलने के बाद से t1.c11
, विदेशी कुंजी बाधा t2.c2
. पर विदेशी कुंजी का अनुपालन करने के लिए अभी भी किसी भी नए सम्मिलन को लागू कर रहा था, भले ही दूसरी तालिका में प्राथमिक कुंजी कॉलम का नाम बदल गया हो।