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

SQL सर्वर, डेटा हानि के बिना तालिका बनाने के बाद ऑटो वेतन वृद्धि कैसे सेट करें?

IDENTITY बदलना संपत्ति वास्तव में एक मेटाडेटा केवल परिवर्तन है। लेकिन मेटाडेटा को सीधे अपडेट करने के लिए एकल उपयोगकर्ता मोड में इंस्टेंस शुरू करने और sys.syscolpars में कुछ कॉलम के साथ गड़बड़ करने की आवश्यकता होती है और गैर-दस्तावेज/असमर्थित है और ऐसा कुछ नहीं है जिसकी मैं अनुशंसा करता हूं या इसके बारे में कोई अतिरिक्त विवरण दूंगा।

SQL सर्वर 2012+ पर इस उत्तर पर आने वाले लोगों के लिए ऑटो इंक्रीमेंटिंग कॉलम के इस परिणाम को प्राप्त करने का अब तक का सबसे आसान तरीका एक SEQUENCE बनाना होगा ऑब्जेक्ट करें और next value for seq कॉलम डिफ़ॉल्ट के रूप में।

वैकल्पिक रूप से, या पिछले संस्करणों के लिए (2005 के बाद से), इस कनेक्ट आइटम पर पोस्ट किया गया वर्कअराउंड ALTER TABLE...SWITCH का उपयोग करके डेटा संचालन के आकार की आवश्यकता के बिना ऐसा करने का पूरी तरह से समर्थित तरीका दिखाता है। . यहां एमएसडीएन पर भी ब्लॉग किया गया। हालांकि इसे प्राप्त करने के लिए कोड बहुत आसान नहीं है और कुछ प्रतिबंध हैं - जैसे तालिका को बदला जा रहा है, विदेशी कुंजी बाधा का लक्ष्य नहीं हो सकता है।

उदाहरण कोड।

बिना किसी IDENTITY के परीक्षण तालिका सेट करें कॉलम।

CREATE TABLE dbo.tblFoo 
(
bar INT PRIMARY KEY,
filler CHAR(8000),
filler2 CHAR(49)
)


INSERT INTO dbo.tblFoo (bar)
SELECT TOP (10000) ROW_NUMBER() OVER (ORDER BY (SELECT 0))
FROM master..spt_values v1, master..spt_values v2

इसे एक IDENTITY के लिए बदलें कॉलम (अधिक या कम तत्काल)।

BEGIN TRY;
    BEGIN TRANSACTION;

    /*Using DBCC CHECKIDENT('dbo.tblFoo') is slow so use dynamic SQL to
      set the correct seed in the table definition instead*/
    DECLARE @TableScript nvarchar(max)
    SELECT @TableScript = 
    '
    CREATE TABLE dbo.Destination(
        bar INT IDENTITY(' + 
                     CAST(ISNULL(MAX(bar),0)+1 AS VARCHAR) + ',1)  PRIMARY KEY,
        filler CHAR(8000),
        filler2 CHAR(49)
        )

        ALTER TABLE dbo.tblFoo SWITCH TO dbo.Destination;
    '       
    FROM dbo.tblFoo
    WITH (TABLOCKX,HOLDLOCK)

    EXEC(@TableScript)


    DROP TABLE dbo.tblFoo;

    EXECUTE sp_rename N'dbo.Destination', N'tblFoo', 'OBJECT';


    COMMIT TRANSACTION;
END TRY
BEGIN CATCH
    IF XACT_STATE() <> 0 ROLLBACK TRANSACTION;
    PRINT ERROR_MESSAGE();
END CATCH;

परिणाम का परीक्षण करें।

INSERT INTO dbo.tblFoo (filler,filler2) 
OUTPUT inserted.*
VALUES ('foo','bar')

देता है

bar         filler    filler2
----------- --------- ---------
10001       foo       bar      

साफ़ करें

DROP TABLE dbo.tblFoo


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. संग्रहीत कार्यविधि क्या है और संग्रहीत कार्यविधि क्यों ?

  2. संग्रहित प्रक्रिया के परिणाम सेट से कॉलम का चयन करें

  3. SQL सर्वर NVarchar फ़ील्ड में जापानी वर्णों के बजाय प्रश्न चिह्न वर्ण क्यों संग्रहीत कर रहा है?

  4. एसक्यूएल सर्वर (टी-एसक्यूएल) में डेटाबेस के संयोजन को कैसे दिखाएं

  5. SP_dbcmptlevel पदावनत होने के बाद SQL सर्वर डेटाबेस संगतता की जाँच कैसे करें?