2010-03-02 10 views
20

असल में मुझे सभी तालिकाओं के लिए मूल रूप से पहचान वृद्धि को रीसेट करने की आवश्यकता है। यहां मैंने कुछ कोड की कोशिश की, लेकिन यह विफल हो गया।एसक्यूएल सर्वर सभी तालिकाओं के लिए पहचान वृद्धि रीसेट करें

http://pastebin.com/KSyvtK5b

लिंक से वास्तविक कोड:

USE World00_Character 
GO 

-- Create a cursor to loop through the System Ojects and get each table name 
DECLARE TBL_CURSOR CURSOR 
-- Declare the SQL Statement to cursor through 
FOR (SELECT Name FROM Sysobjects WHERE Type='U') 

-- Declare the @SQL Variable which will hold our dynamic sql 
DECLARE @SQL NVARCHAR(MAX); 
SET @SQL = ''; 
-- Declare the @TblName Variable which will hold the name of the current table 
DECLARE @TblName NVARCHAR(MAX); 

-- Open the Cursor 
OPEN TBL_CURSOR 

-- Setup the Fetch While that will loop through our cursor and set @TblName 
FETCH NEXT FROM TBL_CURSOR INTO @TblName 
-- Do this while we are not at the end of the record set 
WHILE (@@FETCH_STATUS <> -1) 
BEGIN 
-- Appeand this table's select count statement to our sql variable 
SET @SQL = @SQL + ' (SELECT '''[email protected]+''' AS Table_Name,COUNT(*) AS Count FROM '[email protected]+') UNION'; 

-- Delete info 
EXEC('DBCC CHECKIDENT ('[email protected]+',RESEED,(SELECT IDENT_SEED('[email protected]+')))'); 

-- Pull the next record 
FETCH NEXT FROM TBL_CURSOR INTO @TblName 
-- End the Cursor Loop 
END 

-- Close and Clean Up the Cursor 
CLOSE TBL_CURSOR 
DEALLOCATE TBL_CURSOR 

-- Since we were adding the UNION at the end of each part, the last query will have 
-- an extra UNION. Lets trim it off. 
SET @SQL = LEFT(@SQL,LEN(@SQL)-6); 

-- Lets do an Order By. You can pick between Count and Table Name by picking which 
-- line to execute below. 
SET @SQL = @SQL + ' ORDER BY Count'; 
--SET @SQL = @SQL + ' ORDER BY Table_Name'; 

-- Now that our Dynamic SQL statement is ready, lets execute it. 
EXEC (@SQL); 
GO 

त्रुटि संदेश:

Error: Msg 102, Level 15, State 1, Line 1 Incorrect syntax near '('. 

मैं कैसे या तो ठीक है कि SQL या अपने मूल करने के लिए सभी तालिकाओं के लिए पहचान रीसेट कर सकते हैं?

धन्यवाद

उत्तर

52

आप टेबल जो एक बीज और 1 की वेतन वृद्धि की जरूरत नहीं है की बहुत सारी है ??

यदि नहीं (डिफ़ॉल्ट रूप से, सभी तालिकाओं कि है)

, इस कोड का उपयोग:

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED, 1)' 

MSforeachtable एक गैर-दस्तावेजी, लेकिन बहुत आसान संग्रहीत proc जो अपने डेटाबेस में सभी तालिकाओं के खिलाफ दिए गए आदेश निष्पादित होता है।

आप पूरी तरह सटीक होना करने के लिए की जरूरत है, इस बयान का उपयोग करें - यह अपने मूल बीज मूल्य के लिए सभी तालिकाओं reseed करने के लिए SQL कथन की एक सूची उत्पन्न होगी:

SELECT 
    IDENT_SEED(TABLE_NAME) AS Seed, 
    IDENT_INCR(TABLE_NAME) AS Increment, 
    IDENT_CURRENT(TABLE_NAME) AS Current_Identity, 
    TABLE_NAME, 
    'DBCC CHECKIDENT(' + TABLE_NAME + ', RESEED, ' + CAST(IDENT_SEED(TABLE_NAME) AS VARCHAR(10)) + ')' 
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1 
    AND TABLE_TYPE = 'BASE TABLE' 

ले लो कि उत्पादन में अंतिम स्तंभ, और उन बयानों को निष्पादित करें और आप कर चुके हैं! :-)

(पिनाल डेव द्वारा एक blog post से प्रेरित)

+0

खैर के साथ 1. 10001 के साथ 50 और एक अन्य तो जैसे 50 80 डिफ़ॉल्ट बीज 101 के साथ टेबल और की तरह तो मैं एसक्यूएल में थोड़े पाश करने की कोशिश की मैं है, लेकिन पीएचपी जो आसान हो सकता है के साथ पाश कर की कोशिश करेंगे । – DanSpd

+0

@DanSpd: ऐसा करने के अपने अंतिम और बिल्कुल सही तरीके से मेरा जवाब अपडेट किया गया! :-) का आनंद लें। –

+0

बहुत बहुत धन्यवाद।मेरा काम आसान तरीका बनाता है :) आपसे प्यार करते हैं – DanSpd

2

एक आसान metod sp_MSforeachtable आदेश, एक गैर-दस्तावेजी उपयोग करने के लिए हो सकता है लेकिन अपेक्षाकृत अच्छी तरह से आदेश है कि आपके टेबल के ऊपर लग रहा है पता है।

11

marc_s उत्तर पर थोड़ा tweak।

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED)' 

उन एकल उद्धरणों के आसपास? चरित्र महत्वपूर्ण हैं। वह कथन SQL सर्वर को प्रत्येक तालिका के लिए स्वचालित पहचान मान को स्वचालित रूप से पुन: गणना करने का कारण बन जाएगा।

+0

कूल धन्यवाद, बस यह ढूंढ रहा था! –

5

मामूली बदलाव है कि स्कीमा संभालती थोड़ा बेहतर ...

SELECT 
    IDENT_SEED(TABLE_SCHEMA+'.'+TABLE_NAME) AS Seed, 
    IDENT_INCR(TABLE_SCHEMA+'.'+TABLE_NAME) AS Increment, 
    IDENT_CURRENT(TABLE_SCHEMA+'.'+TABLE_NAME) AS Current_Identity, 
    TABLE_SCHEMA+'.'+TABLE_NAME, 
    'DBCC CHECKIDENT('''+TABLE_SCHEMA+'.'+TABLE_NAME+''', RESEED, '+CAST(IDENT_SEED(TABLE_SCHEMA+'.'+TABLE_NAME) AS VARCHAR(10))+')' 
FROM 
    INFORMATION_SCHEMA.TABLES 
WHERE 
    OBJECTPROPERTY(OBJECT_ID(TABLE_SCHEMA+'.'+TABLE_NAME), 'TableHasIdentity') = 1 
AND TABLE_TYPE = 'BASE TABLE' 
ORDER BY TABLE_SCHEMA, TABLE_NAME 
2

एक पहचान स्तंभ आप अगले स्क्रिप्ट का उपयोग कर सकते हैं साथ ही टेबल reseed करने के लिए। यह sp_MSforeachtable का उपयोग भी करता है लेकिन सही तालिकाओं को ध्यान में रखता है।

EXEC sp_MSforeachtable ' 
IF (SELECT COUNT(1) 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE TABLE_TYPE = ''BASE TABLE'' 
    AND ''[''+ TABLE_SCHEMA + ''].['' + TABLE_NAME + '']'' = ''?'' 
    AND OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), ''TableHasIdentity'') = 1) > 0 
BEGIN 
    DBCC CHECKIDENT (''?'', RESEED, 1) 
END' 
0

नीचे कोड का प्रयोग करें,

CREATE TABLE #tmptable 
(
    [seednvalue] int not null, 
    [tablename] [nvarchar] (100) NULL 
) 


declare @seedvalue AS INT 
DECLARE @tablename AS VARCHAR(100) 

Declare #tablesIdentityCursor CURSOR 
    for 
    SELECT 
    IDENT_CURRENT(TABLE_NAME)+1 AS Current_Identity, 
    TABLE_NAME 
    FROM INFORMATION_SCHEMA.TABLES 
    WHERE OBJECTPROPERTY(OBJECT_ID(TABLE_NAME), 'TableHasIdentity') = 1 
    AND TABLE_TYPE = 'BASE TABLE' --AND TABLE_NAME='test11' 

delete from #tmptable 
Open #tablesIdentityCursor 
FETCH NEXT FROM #tablesIdentityCursor into @seedvalue, @tablename 
WHILE @@FETCH_STATUS = 0 BEGIN 

    Insert into #tmptable Select @seedvalue , @tablename 
    DBCC CHECKIDENT (@tablename, reseed, @seedvalue) 
    FETCH NEXT FROM #tablesIdentityCursor into @seedvalue, @tablename 
END 
CLOSE #tablesIdentityCursor 
DEALLOCATE #tablesIdentityCursor 
SELECT * FROM #tmptable 
DROP TABLE #tmptable 
2

sp_MSForEachTable का उपयोग करने और जाँच या नहीं, टेबल रीसेट करने से पहले एक पहचान मान है का एक अन्य तरीका:

EXEC sp_MSForEachTable ' 
Print ''?'' 
IF OBJECTPROPERTY(object_id(''?''), ''TableHasIdentity'') = 1 
    DBCC CHECKIDENT (''?'', RESEED, 0) 
else 
    Print ''Table does not have an identity value'' 
' 

नोट: यदि आप पहचान मान 1 से शुरू करना चाहते हैं तो डीबीसीसी कमांड को CHECKIDENT (''?'', RESEED, 0)CHECKIDENT (''?'', RESEED, 1) का उपयोग नहीं करना चाहिए कुछ उत्तरों में निहित। MS SQL Server documentation से उद्धरण:

निम्न उदाहरण से 10 के एक मूल्य के लिए AddressType तालिका में AddressTypeID स्तंभ में वर्तमान पहचान मूल्य बलों तालिका पंक्तियों मौजूदा गया है, अगली पंक्ति डाला 11 रूप में प्रयोग करेंगे मूल्य, वह यह है कि नई वर्तमान वृद्धि मान स्तंभ मान के लिए परिभाषित प्लस 1 जब इस आदेश का उपयोग कर अपने तालिका डेटा अपने सभी नए आवेषण होगा रेस में शामिल है, तो

USE AdventureWorks2012; 
GO 
DBCC CHECKIDENT ('Person.AddressType', RESEED, 10); 
GO 
+0

बिल्कुल सही, मैंने केवल एक 'जोड़ा'? 'प्रिंट स्टेटमेंट में, इसलिए मुझे पता था कि किस तालिका में पहचान नहीं थी। –

5

सावधान रहें ULT त्रुटि नकल

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED,1)' 

समस्या आप डेटा मौजूद

0

(I'm reposting my answer from this other SO page)

इस अंतिम स्तंभ पहचान करने के लिए बीज को रीसेट कर देगा कि

exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT(''?'', RESEED)' 

के बाद इस चलाने की आवश्यकता को हल करने के

शायद सबसे आसान तरीका (इस ध्वनि के रूप में पागल और जैसा दिखता है कोड कोडर के रूप में) DBCC CHECKIDENT को इस तरह दो बार चलाने के लिए है:

-- sets all the seeds to 1 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'', RESEED, 1)' 

-- run it again to get MSSQL to figure out the MAX/NEXT seed automatically 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')' 

हो गया।

:

-- run it again to display what the seeds are now set to 
exec sp_MSforeachtable @command1 = 'DBCC CHECKIDENT (''?'')' 

इस दस्तावेज़ से टिप्पणी का लाभ लेने के लिए सिर्फ एक रचनात्मक तरीका है:

यदि आप चाहते हैं, आप इसे एक बार और अधिक देखने के लिए सभी बीज के लिए स्थापित किए गए थे चला सकते हैं

यदि तालिका के लिए वर्तमान पहचान मान अधिकतम पहचान कॉलम में संग्रहीत पहचान मान से कम है, तो यह पहचान कॉलम में अधिकतम मूल्य का उपयोग कर रीसेट कर दिया गया है।

संबंधित मुद्दे