Sqlserver
 sql >> डेटाबेस >  >> RDS >> Sqlserver

SQL सर्वर में एक तालिका का नाम बदलें (T-SQL)

SQL सर्वर में, आप sp_rename . का उपयोग कर सकते हैं तालिका सहित किसी वस्तु का नाम बदलने के लिए संग्रहीत कार्यविधि।

अधिकांश अन्य प्रमुख RDBM आपको ALTER TABLE वाली तालिका का नाम बदलने की अनुमति देते हैं कथन, लेकिन SQL सर्वर के साथ ऐसा नहीं है।

उदाहरण

प्रदर्शित करने के लिए यहां एक उदाहरण दिया गया है:

EXEC sp_rename 't1', 't2';

यह t1 . नामक तालिका का नाम बदल देता है करने के लिए t2

स्कीमा नाम सहित

आप स्कीमा नाम के साथ पहली तालिका को भी अर्हता प्राप्त कर सकते हैं, इस स्थिति में, यह कुछ इस तरह दिख सकता है:

EXEC sp_rename 'dbo.t1', 't2';

इस उदाहरण में, dbo स्कीमा नाम है, लेकिन आपको जो भी स्कीमा लागू हो उसका उपयोग करना होगा।

पैरामीटर नामों सहित

किसी भी संग्रहीत कार्यविधि की तरह, sp_rename . को कॉल करते समय आप पैरामीटर नाम भी शामिल कर सकते हैं :

EXEC sp_rename 
    @objname = 'dbo.t1',
    @newname = 't2';

sp_rename प्रक्रिया एक @objtype भी स्वीकार करती है पैरामीटर, लेकिन तालिकाओं का नाम बदलते समय यह आवश्यक (या समर्थित) नहीं है।

संदर्भों की जांच करें

जब आप SQL सर्वर में किसी तालिका का नाम बदलते हैं, तो आपको संभवतः इस तरह का एक संदेश दिखाई देगा:

Caution: Changing any part of an object name could break scripts and stored procedures.

ऐसा इसलिए है क्योंकि जब आप किसी तालिका का नाम बदलते हैं, तो SQL सर्वर नहीं करता है स्वचालित रूप से उस तालिका के किसी भी संदर्भ का नाम बदलें। जब आप किसी कॉलम का नाम बदलते हैं तो यह भी सच होता है।

उपरोक्त चेतावनी संदेश के बावजूद, वैसे भी तालिका का नाम बदल दिया गया है।

इसलिए, किसी भी तालिका का नाम बदलने से पहले, आपको हमेशा उस तालिका को संदर्भित करने वाली स्क्रिप्ट और संग्रहीत कार्यविधियों की जांच करनी चाहिए। तालिका के नए नाम को संदर्भित करने के लिए आपको ऐसी स्क्रिप्ट और प्रक्रियाओं को अपडेट करना होगा।

आप sys.sql_expression_dependencies . का उपयोग कर सकते हैं यह जाँच करने के लिए सिस्टम कैटलॉग दृश्य।

उदाहरण:

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

इस मामले में मैं इसमें sys.objects . के साथ शामिल हुआ अधिक जानकारी वापस करने के लिए।

t1 . का नाम बदलने से पहले मुझे यह परिणाम मिलता है तालिका:

+----------------------+----------------------+----------+---------------------+----------+
 | Referencing Entity   | Type                 | Column   | Referenced Entity   | Column   |
 |----------------------+----------------------+----------+---------------------+----------|
 | usp_t1               | SQL_STORED_PROCEDURE | (n/a)    | t1                  | (n/a)    |
 | vt1                  | VIEW                 | (n/a)    | t1                  | (n/a)    |
 | t1                   | USER_TABLE           | c2       | t1                  | c1       |
 +----------------------+----------------------+----------+---------------------+----------+ 

यह मुझे दिखाता है कि t1 पर निर्भर एक दृश्य, एक संग्रहीत कार्यविधि और एक परिकलित स्तंभ है टेबल। परिकलित कॉलम (c2 ) c1 . का संदर्भ देता है एक ही टेबल में कॉलम।

जैसा कि उल्लेख किया गया है, तालिका का नाम बदलने से पहले इस चेक को चलाना महत्वपूर्ण है। तालिका का नाम बदलने के बाद उसी स्क्रिप्ट को चलाने पर मुझे जो परिणाम मिलता है वह यह है।

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't1');

परिणाम:

(0 rows affected) 

इस मामले में, मैंने टेबल के मूल नाम (t1 .) का इस्तेमाल किया ), इसलिए यह बिल्कुल स्पष्ट है कि हमने सही तालिका को भी लक्षित नहीं किया (t2 )।

नए तालिका नाम को संदर्भित करने के लिए बस इस स्क्रिप्ट को बदलने से भी काम नहीं चलेगा। उदाहरण के लिए, तालिका का नाम t1 . से बदलने के बाद निम्न स्क्रिप्ट चलाना करने के लिए t2 केवल एक निर्भरता (गणना कॉलम) देता है।

SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity],   
    o.type_desc AS [Type],   
    COALESCE(COL_NAME(referencing_id, referencing_minor_id), '(n/a)') AS [Column],
    referenced_entity_name AS [Referenced Entity],   
    COALESCE(COL_NAME(referenced_id, referenced_minor_id), '(n/a)') AS [Column]
FROM sys.sql_expression_dependencies AS sed  
INNER JOIN sys.objects AS o ON sed.referencing_id = o.object_id  
WHERE referenced_id = OBJECT_ID(N't2');

परिणाम:

+----------------------+------------+----------+---------------------+----------+
 | Referencing Entity   | Type       | Column   | Referenced Entity   | Column   |
 |----------------------+------------+----------+---------------------+----------|
 | t2                   | USER_TABLE | c2       | t2                  | c1       |
 +----------------------+------------+----------+---------------------+----------+ 

अच्छी खबर यह है कि परिकलित कॉलम लौटा दिया जाता है। बुरी खबर यह है कि दृश्य और संग्रहीत कार्यविधि वापस नहीं की जाती है।

निचली पंक्ति:तालिका का नाम बदलने से पहले निर्भरताओं की जांच करें। फिर किसी भी ऑब्जेक्ट को मैन्युअल रूप से अपडेट करें जो नामित तालिका को संदर्भित करता है।


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. XML क्रमांकन के लिए StringWriter का उपयोग करना

  2. विशिष्ट अभिलेखों पर PIVOT क्वेरी

  3. SQL क्वेरी द्वारा किसी विशेष डेटाबेस के सभी तालिका नाम प्राप्त करें?

  4. SQL सर्वर:((int) वर्ष, (int) माह, (int) दिन) को डेटाटाइम में बदलें

  5. SQL डिफ़ॉल्ट बाधा को उसका नाम जाने बिना कैसे छोड़ें?