SQL सर्वर डेटाबेस में सभी तालिकाओं को कैसे छोड़ें?


195

मैं एक स्क्रिप्ट लिखने की कोशिश कर रहा हूं जो SQL सर्वर डेटाबेस को पूरी तरह से खाली कर देगा। अभी तक मेरे पास इतना ही है:

USE [dbname]
GO
EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DELETE ?'

जब मैं इसे प्रबंधन स्टूडियो में चलाता हूं, मुझे मिलता है:

कमांड (ओं) को सफलतापूर्वक पूरा किया।

लेकिन जब मैं तालिका सूची को ताज़ा करता हूं, तो वे सभी अभी भी वहां होते हैं। मैं क्या गलत कर रहा हूं?


यदि इस पृष्ठ पर कोई भी समाधान काम नहीं कर रहा है, तो शायद आप भूल गए: USE [DatabaseName] GO
Serj Sagan

2
DELETE? तालिका से रिकॉर्ड हटा देगा। आपको DROP टेबल का उपयोग करना चाहिए? हालांकि, जो अन्य कारणों से काम नहीं करेगा।
डेटागोड 13

जवाबों:


306

यह मेरे लिए तब काम नहीं करता है जब कई विदेशी कुंजी टेबल हों।
मैंने पाया कि कोड जो काम करता है और वह सब कुछ करता है जो आप कोशिश करते हैं (अपने डेटाबेस से सभी तालिकाओं को हटा दें):

DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR

SET @Cursor = CURSOR FAST_FORWARD FOR
SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.TABLE_SCHEMA + '].[' +  tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + '];'
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME =rc1.CONSTRAINT_NAME

OPEN @Cursor FETCH NEXT FROM @Cursor INTO @Sql

WHILE (@@FETCH_STATUS = 0)
BEGIN
Exec sp_executesql @Sql
FETCH NEXT FROM @Cursor INTO @Sql
END

CLOSE @Cursor DEALLOCATE @Cursor
GO

EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

आप यहाँ पोस्ट पा सकते हैं । यह Groker द्वारा पोस्ट है।


जब आप BEGIN-END ब्लॉक का उपयोग करके कर्सर के बारे में शिकायत करते हैं, तो यह एक IF स्टेटमेंट में कोड के उस पूरे ब्लॉक को लपेटने का प्रयास क्यों करता है?
आदम

11
मुझे त्रुटि मिल रही हैCould not find stored procedure 'sp_MSForEachTable'.
कोरीयम

2
यदि आपके पास एक अलग स्कीमा में तालिकाओं (बाधाओं के साथ) है तो यह उत्तर काम नहीं करता है dbo। यदि आपके पास कस्टम स्कीमा है, तो आपको इसमें परिवर्तन करने की आवश्यकता sqlहै:SELECT DISTINCT sql = 'ALTER TABLE [' + tc2.CONSTRAINT_SCHEMA + '].[' + tc2.TABLE_NAME + '] DROP [' + rc1.CONSTRAINT_NAME + ']'
Asbjørn Ulsberg

5
sp_MSforeachtableAzure में उपलब्ध नहीं है। इसके बजाय @ काउंटजेरो के उत्तर का उपयोग करें।
ओग्लास

3
वेब पर यह संदर्भ नहीं मिला (मेरा नहीं): ए कॉपी ऑफ़ अज़ुरे, अज़ यूज़ के लिए sp_MSforeachtable की एक कॉपी, sp_MSforeach_worker: gist.github.com/metaskills/893599 का उपयोग करता है ।
जोओ विएरा

330

आप केवल MSSMS UI टूल (SQL स्क्रिप्ट का उपयोग किए बिना) डेटाबेस से सभी तालिकाओं को हटा सकते हैं। कभी-कभी यह तरीका अधिक आरामदायक हो सकता है (विशेषकर यदि यह कभी-कभी किया जाता है)

मैं इस कदम को इस प्रकार करता हूँ:

  1. डेटाबेस ट्री पर 'टेबल्स' का चयन करें (ऑब्जेक्ट एक्सप्लोरर)
  2. ऑब्जेक्ट एक्सप्लोरर विवरण देखने के लिए F7 दबाएं
  3. इस दृश्य में उन तालिकाओं का चयन करें जिन्हें हटाना है (इस स्थिति में वे सभी)
  4. तब तक डिलीट को दबाए रखें जब तक कि सभी टेबल डिलीट न हो जाएं (आप इसे कई बार कुंजी की बाधाओं / निर्भरता के कारण त्रुटियों की मात्रा के रूप में दोहराते हैं)

5
मुझे Azure sql db पर काम करने के लिए sp_msforeachtable नहीं मिल सका। मुझे लगता है कि वे इसे एज़्योर के लिए शामिल नहीं कर रहे हैं। यह समाधान बढ़िया काम करता है और ईएफ माइग्रेशन के साथ बहुत सारे बदलावों को शुरू करने या खत्म करने के लिए एकदम सही है।
trevorc

एफके / आदेश पर विचार नहीं करता है।
जोश

1
यह एक आसान तरीका है अगर आपको इसे यहाँ और वहाँ करने की ज़रूरत है, तो स्क्रिप्ट बेहतर हो सकती है यदि आप इसे अक्सर कर रहे हैं।
डायलन हेस

2
@ जोश पर विचार नहीं किया जाता है, लेकिन यदि आप डिलीट डायलॉग में ओके दबाते रहेंगे तो यह सभी टेबल को हटा सकता है, जो अंततः सभी टेबल को हटा देगा।
क्लेरी

डिजाइनर का उपयोग करके सही समाधान
जहीर

49

SSMS में:

  • डेटाबेस पर राइट क्लिक करें
  • "कार्य" पर जाएं
  • "लिपियों उत्पन्न करें" पर क्लिक करें
  • "ऑब्जेक्ट्स चुनें" अनुभाग में, "स्क्रिप्ट संपूर्ण डेटाबेस और सभी डेटाबेस ऑब्जेक्ट" चुनें
  • "स्क्रिप्टिंग विकल्प सेट करें" अनुभाग में, "उन्नत" बटन पर क्लिक करें
  • "स्क्रिप्ट DROP और" "स्क्रिप्ट DROP" पर "स्क्रिप्ट बनाएँ" स्विच करें और ओके दबाएं
  • फिर, या तो फ़ाइल, क्लिपबोर्ड, या नई क्वेरी विंडो में सहेजें।
  • स्क्रिप्ट चलाएँ।

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


3
यदि आप डेटाबेस को नहीं छोड़ना चाहते हैं (जो मेरे मामले में मेरे अनुसार नहीं है तो मुझे इसे बनाने के लिए एक समर्थन कॉल करने की आवश्यकता होगी) तो 'विशिष्ट डेटाबेस ऑब्जेक्ट्स का चयन करें' का उपयोग करें और सभी ऑब्जेक्ट प्रकारों का चयन करें तुम छोड़ना चाहते हो
d219

3
यह सबसे आसान तरीका है।
आसिरी डिसनायका

2
यह सुनिश्चित करने के लिए जवाब होना चाहिए!
Zac टेलर

34

deleteतालिका से पंक्तियों को हटाने के लिए उपयोग किया जाता है। आपको drop tableइसके बजाय उपयोग करना चाहिए ।

EXEC sp_msforeachtable 'drop table [?]'

ऐसा लगता है कि कोई त्रुटि नहीं होने की समस्या को ठीक कर दिया गया था, लेकिन अब मैं बाधाओं में चल रहा हूं। क्या मेरी NOCHECK CONSTRAINTरेखा का वाक्य विन्यास गलत है?
दीक्षुजी

1
मैंने एफके के साथ एक त्वरित 2 तालिकाओं पर इसका इस्तेमाल किया और यह काम किया। EXEC sp_msforeachtable 'टेटर टेबल? NOCHECK CONSTRAINT all '
डेवशॉ

12
वर्ग कोष्ठक हटाने के बाद यह केवल मेरे लिए काम करता है: EXEC sp_msforeachtable 'ड्रॉप टेबल?'।
एलपीन्स

SQL सर्वर पर आपको कोष्ठक की आवश्यकता होती है यदि किसी तालिका नाम में कोई विषम वर्ण या स्थान हो। मुझे SQL सर्वर का कोई संस्करण ज्ञात नहीं है जो ऑब्जेक्ट नाम के आसपास कोष्ठक का समर्थन नहीं करता है।
डेवशॉ

SQL Server 2012 (11.x) पर मुझे स्क्वायर ब्रैकेट्स को भी निकालना था।
फ्रेडर

30

स्वीकृत उत्तर Azure का समर्थन नहीं करता है। यह एक undocumented संग्रहीत कार्यविधि "sp_MSforeachtable" का उपयोग करता है। यदि आपको "azure को संग्रहीत प्रक्रिया 'sp_msforeachtable" नहीं मिल पा रही है, तो रनिंग के दौरान या बस अनजाने सुविधाओं पर निर्भर रहने से बचना चाहते हैं (जिन्हें हटाया जा सकता है या उनकी कार्यक्षमता किसी भी बिंदु पर बदल सकती है) तो नीचे की कोशिश करें।

यह संस्करण एंटिटी फ्रेमवर्क माइग्रेशन हिस्ट्री टेबल "__ माइग्रेशनहिस्टर" और "डेटाबेस_फायरवॉल_रल्स" को नजरअंदाज करता है, जो एक एज़्योर टेबल है जिसे आपको हटाने की अनुमति नहीं होगी।

हल्के से Azure पर परीक्षण किया गया। इसे बनाने के लिए जाँच करें इससे आपके पर्यावरण पर कोई अवांछित प्रभाव नहीं पड़ता है।

DECLARE @sql NVARCHAR(2000)

WHILE(EXISTS(SELECT 1 from INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE CONSTRAINT_TYPE='FOREIGN KEY'))
BEGIN
    SELECT TOP 1 @sql=('ALTER TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + '] DROP CONSTRAINT [' + CONSTRAINT_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS
    WHERE CONSTRAINT_TYPE = 'FOREIGN KEY'
    EXEC(@sql)
    PRINT @sql
END

WHILE(EXISTS(SELECT * from INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'))
BEGIN
    SELECT TOP 1 @sql=('DROP TABLE ' + TABLE_SCHEMA + '.[' + TABLE_NAME + ']')
    FROM INFORMATION_SCHEMA.TABLES
    WHERE TABLE_NAME != '__MigrationHistory' AND TABLE_NAME != 'database_firewall_rules'
    EXEC(@sql)
    PRINT @sql
END

से लिया गया:

https://edspencer.me.uk/2013/02/25/drop-all-tables-in-a-sql-server-database-azure-friendly/

http://www.sqlservercentral.com/blogs/sqlservertips/2011/10/11/remove-all-foreign-keys/


3
जादू पर जादू का काम किया। बहुत तेजी से तो वी.एस. के यूआई के माध्यम से दूर करने
शिमोन Grigorovich

27
/* Drop all Primary Key constraints */
DECLARE @name VARCHAR(128)
DECLARE @constraint VARCHAR(254)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)

WHILE @name IS NOT NULL
BEGIN
    SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    WHILE @constraint is not null
    BEGIN
        SELECT @SQL = 'ALTER TABLE [dbo].[' + RTRIM(@name) +'] DROP CONSTRAINT [' + RTRIM(@constraint)+']'
        EXEC (@SQL)
        PRINT 'Dropped PK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' AND CONSTRAINT_NAME <> @constraint AND TABLE_NAME = @name ORDER BY CONSTRAINT_NAME)
    END
SELECT @name = (SELECT TOP 1 TABLE_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'PRIMARY KEY' ORDER BY TABLE_NAME)
END
GO

/* Drop all tables */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Table: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

1
SQL Azure में काम करता है :) sp_MSforeachtable वहाँ काम नहीं करता है
Pavel Biryukov

एक नोट के रूप में, यह विफल हो जाएगा यदि आपके पास नॉन-डोब स्कीमा है (जैसे यदि आप हैंगफ़ायर का उपयोग कर रहे हैं)
लियाम डावसन

21

आप लगभग सही हैं, इसके बजाय उपयोग करें:

EXEC sp_msforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT all'
EXEC sp_msforeachtable 'DROP TABLE ?'

लेकिन दूसरी पंक्ति आपको तब और अधिक निष्पादित करने की आवश्यकता हो सकती है जब तक आप त्रुटि प्राप्त करना बंद नहीं कर देते:

Could not drop object 'dbo.table' because it is referenced by a FOREIGN KEY constraint.

संदेश:

Command(s) completed successfully.

इसका मतलब है कि सभी तालिका को सफलतापूर्वक हटा दिया गया था।


17

छोटा एवं सुन्दर:

USE YOUR_DATABASE_NAME
-- Disable all referential integrity constraints
EXEC sp_MSforeachtable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Drop all PKs and FKs
declare @sql nvarchar(max)
SELECT @sql = STUFF((SELECT '; ' + 'ALTER TABLE ' + Table_Name  +'  drop constraint ' + Constraint_Name  from Information_Schema.CONSTRAINT_TABLE_USAGE ORDER BY Constraint_Name FOR XML PATH('')),1,1,'')
EXECUTE (@sql)
GO

-- Drop all tables
EXEC sp_MSforeachtable 'DROP TABLE ?'
GO

2
मुझे इसके sp_msforeachtableद्वारा प्रतिस्थापित sp_MSforeachtableकरना होगा और use yourdatabaseपहली पंक्ति के रूप में जोड़ने की अत्यधिक अनुशंसा करनी होगी । एक जादू की तरह काम किया।
साइमन सोबिस्क

छोटा एवं सुन्दर! Thnx।
sapatelbaps

7

उपवास का तरीका है:

  1. नई डेटाबेस आरेख
  2. सभी तालिका जोड़ें
  3. Ctrl + A सभी का चयन करने के लिए
  4. राइट क्लिक "डेटाबेस से निकालें"
  5. Ctrl + S सहेजने के लिए
  6. का आनंद लें

ऐसा करने के लिए यह अब तक का सबसे तेज, कम त्रुटि वाला तरीका है। यह स्वीकृत उत्तर होना चाहिए।
DARKGuy

6

लगता है कि कमांड को वर्गाकार कंबल के बिना होना चाहिए

EXEC sp_msforeachtable 'drop table ?'

6

मेरे लिए, सबसे आसान तरीका:

--First delete all constraints

DECLARE @sql NVARCHAR(MAX);
SET @sql = N'';

SELECT @sql = @sql + N'
ALTER TABLE ' + QUOTENAME(s.name) + N'.'
+ QUOTENAME(t.name) + N' DROP CONSTRAINT '
+ QUOTENAME(c.name) + ';'
FROM sys.objects AS c
INNER JOIN sys.tables AS t
ON c.parent_object_id = t.[object_id]
INNER JOIN sys.schemas AS s 
ON t.[schema_id] = s.[schema_id]
WHERE c.[type] IN ('D','C','F','PK','UQ')
ORDER BY c.[type];

EXEC sys.sp_executesql @sql;

-- Then drop all tables

exec sp_MSforeachtable 'DROP TABLE ?'

2

सटीक!!

डेटाबेस से सभी तालिकाओं को हटाने के लिए आप नीचे क्वेरी का उपयोग कर सकते हैं

EXEC sp_MSforeachtable @ कमांड 1 = "ड्रॉप टेबल?"

हैप्पी कोडिंग!


1

कैसे पूरे डेटाबेस को छोड़ने और फिर इसे बनाने के बारे में? यह मेरे लिए काम करता है।

DROP DATABASE mydb;
CREATE DATABASE mydb;

क्या आपको mdf और ldf फ़ाइलों को बीच में ब्लास्ट करने की आवश्यकता नहीं है?
रफिन

मैं एक वेब होस्ट प्रदाता का उपयोग कर रहा हूं और मैं इसके बारे में निश्चित नहीं हूं। मुझे लगता है कि जब तक आप ऑफ़लाइन नहीं होंगे, तब तक उन फ़ाइलों को स्वचालित रूप से हटा दिया जाएगा।
चोंग लिप फंग

2
यह वास्तव में परिस्थितियों पर निर्भर करता है। मेरे मामले में, मेरे पास संग्रहीत कार्यविधियाँ नहीं हैं और यह विधि मेरे लिए ठीक काम करती है। मैं ऐसे जटिल कोड लिखने नहीं जा रहा हूँ जो दो लाइनों के दर्जनों लाइनों को फैलाएंगे। मुझे नहीं लगता कि मेरा जवाब किसी डाउनवोट को सही ठहराता है क्योंकि मैं उपयोगकर्ताओं के एक विशिष्ट समूह को एक सुझाव दे रहा हूं।
चोंग लिप फांग

0

मुझे पता है कि यह एक पुरानी पोस्ट है, लेकिन मैंने यहां सभी उत्तरों को डेटाबेस की एक भीड़ पर आजमाया है और मैंने पाया है कि वे सभी कभी-कभी काम करते हैं लेकिन विभिन्न समय के लिए नहीं (मैं केवल मान सकता हूं) SQL सर्वर की quirks।

आखिरकार मैं यह लेकर आया। मैंने हर जगह इसका परीक्षण किया है (आम तौर पर बोलते हुए) मैं कर सकता हूं और यह काम करता है (बिना किसी छिपी हुई दुकान प्रक्रियाओं के)।

नोट के लिए ज्यादातर SQL सर्वर 2014 पर। (लेकिन अधिकांश अन्य संस्करणों की मैंने कोशिश की यह भी ठीक काम करता है)।

मैंने कोशिश की है कि छोरों और नल आदि आदि, श्राप देने वाले और अन्य विभिन्न रूपों में, लेकिन वे हमेशा कुछ डेटाबेस में विफल होते दिखते हैं, लेकिन अन्य किसी स्पष्ट कारण के लिए नहीं।

एक गिनती प्राप्त करना और उस पुनरावृति का उपयोग करना जो हमेशा Ive परीक्षण की गई हर चीज पर काम करता है।

USE [****YOUR_DATABASE****]
GO

SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

-- Drop all referential integrity constraints --
-- Drop all Primary Key constraints.          --

DECLARE @sql  NVARCHAR(296)
DECLARE @table_name VARCHAR(128)

DECLARE @constraint_name VARCHAR(128)
SET @constraint_name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME

WHILE @row_number > 0
BEGIN
    BEGIN
        SELECT TOP 1 @table_name = tc2.TABLE_NAME, @constraint_name = rc1.CONSTRAINT_NAME FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS rc1
        LEFT JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc2 ON tc2.CONSTRAINT_NAME = rc1.CONSTRAINT_NAME
        AND rc1.CONSTRAINT_NAME > @constraint_name
        ORDER BY rc1.CONSTRAINT_NAME
        SELECT @sql = 'ALTER TABLE [dbo].[' + RTRIM(@table_name) +'] DROP CONSTRAINT [' + RTRIM(@constraint_name)+']'
        EXEC (@sql)
        PRINT 'Dropped Constraint: ' + @constraint_name + ' on ' + @table_name
        SET @row_number = @row_number - 1
    END
END
GO

-- Drop all tables --

DECLARE @sql  NVARCHAR(156)
DECLARE @name VARCHAR(128)
SET @name = ''

DECLARE @row_number INT

SELECT @row_number = Count(*) FROM sysobjects WHERE [type] = 'U' AND category = 0

WHILE @row_number > 0
BEGIN
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'U' AND category = 0 AND [name] > @name ORDER BY [name])
    SELECT @sql = 'DROP TABLE [dbo].[' + RTRIM(@name) +']'
    EXEC (@sql)
    PRINT 'Dropped Table: ' + @name
    SET @row_number = @row_number - 1
END
GO

0

के लिए अस्थायी टेबल्स उसे कुछ अतिरिक्त इस तथ्य के कारण के लिए वहाँ कुछ विदेशी कुंजी और भी अपवाद हो सकता है जटिल है:

Drop table operation failed on table XXX because it is not a supported operation on system-versioned temporal tables

आप क्या उपयोग कर सकते हैं:

-- Disable constraints (foreign keys)
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

-- Disable system versioning (temporial tables)
EXEC sp_MSForEachTable '
 IF OBJECTPROPERTY(object_id(''?''), ''TableTemporalType'') = 2
  ALTER TABLE ? SET (SYSTEM_VERSIONING = OFF)
'
GO

-- Removing tables
EXEC sp_MSForEachTable 'DROP TABLE ?'
GO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.