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


176

मैं उन सभी को छोड़ने के लिए सभी तालिकाओं का नाम नहीं लिखना चाहता। क्या यह एक क्वेरी से संभव है?


3
कुछ त्वरित googling ने इस बात का खुलासा किया: stackoverflow.com/questions/11053116/…
JSK NS

-हालांकि (SQLServer के लिए) यह अधिक उपयोगी हो सकता है: stackoverflow.com/questions/536350/…

सही उपयोगकर्ता नाम के साथ, यह स्वचालित रूप से हो सकता है ( अनिवार्य xkcd लिंक )।
मिनट डेव

11
क्या आपके पास डेटाबेस में तालिकाओं पर कोई विदेशी कुंजी है? यदि ऐसा है, तो आपको टेबल को गिराने की कोशिश करने से पहले उस पर विचार करना होगा, और उन्हें छोड़ना होगा।
एंथनी ग्रिस्ट

ध्यान रखें कि यदि आपके पास स्कीमाबाउंड ऑब्जेक्ट हैं तो आप टेबल को नहीं गिरा सकते।
सीन लैंग

जवाबों:


176

तालिकाओं की सूची प्राप्त करने के लिए INFORMATION_SCHEMA.TABLES दृश्य का उपयोग करें । चुनिंदा स्टेटमेंट में ड्रॉप स्क्रिप्ट जेनरेट करें और डायनामिक एसक्यूएल का उपयोग कर इसे ड्रॉप करें:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

Sys.Tables संस्करण

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' Drop table ' + QUOTENAME(s.NAME) + '.' + QUOTENAME(t.NAME) + '; '
FROM   sys.tables t
       JOIN sys.schemas s
         ON t.[schema_id] = s.[schema_id]
WHERE  t.type = 'U'

Exec sp_executesql @sql

नोट: यदि आपने foreign Keysतालिकाओं के बीच कोई परिभाषित किया है, तो पहले अपने डेटाबेस में मौजूद सभी को अक्षम करने के लिए नीचे क्वेरी को foreign keysचलाएँ।

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

अधिक जानकारी के लिए, यहाँ देखें


3
(मेरे नीच नहीं) ... मैं आमतौर पर [sys]स्कीमा विचारों के साथ रहना चाहता हूँ अगर rdbms में पोर्टेबिलिटी की आवश्यकता नहीं है। stackoverflow.com/a/3654313/251174
स्वैसेक


1
@ डबलू - यह बहुत सरल है। पहले मेरे डेटाबेस में सभी तालिकाओं के लिए ड्रॉप स्टेटमेंट्स बना रहे हैं और इसे एक वेरिएबल में स्टोर कर रहे हैं। इसे जांचने के लिए आप Print @sqlपहले इस्तेमाल कर सकते हैं exec। फिर sp_executesql
बजे

2
यदि आप Azure का उपयोग कर रहे हैं, तो sp_msforeachtable उपलब्ध नहीं है। मैंने FK की सभी बाधाओं को हटाने के लिए @Aaron बर्ट्रेंड से इस मीठे डली को पाया। इस उत्तर के साथ वास्तव में अच्छा काम करता है। dba.stackexchange.com/questions/90033/…
trevorc

3
यदि sp_msforeachtable उपलब्ध नहीं है, तो आप कई बार डिलीट क्वेरी भी चला सकते हैं, क्योंकि टेबल जो दूसरों पर निर्भर हैं, फिर डिलीट कर दी जाती हैं :)
Maarten Kieft

88

यदि आप सभी तालिकाओं को हटाने के लिए केवल एक SQL क्वेरी का उपयोग करना चाहते हैं, तो आप इसका उपयोग कर सकते हैं:

EXEC sp_MSforeachtable @command1 = "DROP TABLE ?"

यह sql सर्वर में एक छिपी हुई संग्रहीत कार्यविधि है, और आपके द्वारा कनेक्ट किए गए डेटाबेस में प्रत्येक तालिका के लिए निष्पादित किया जाएगा।

नोट: आपको निर्भरता के कारण सभी तालिकाओं को हटाने के लिए क्वेरी को कुछ बार निष्पादित करना पड़ सकता है।

नोट 2: क्वेरी चलाने से पहले पहले नोट से बचने के लिए, पहले यह देख लें कि किसी टेबल पर विदेशी कुंजी संबंध हैं या नहीं। यदि फिर क्वेरी बलो को चलाकर विदेशी कुंजी बाधा को निष्क्रिय कर दिया जाए :

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

1
मैंने इसे अपने एज़्योर SQL डेटाबेस पर आज़माया, और यह काम नहीं किया। हालाँकि उपरोक्त उत्तर (Prdp द्वारा) ने काम किया।
Artemious

4
साइड नोट के लिए, मुझे सभी तालिकाओं को छोड़ने से पहले कई बार पहले कमांड चलाने की आवश्यकता है लेकिन यह ठीक काम करता है।
Alper

1
@Thatshowweroll शायद टेबल की निर्भरता के कारण। यदि एक तालिका में अन्य हैं जो उस पर निर्भर हैं तो उसे हटाया नहीं जा सकता।
रागअगैनेस्टइनमाचिन २age'१

1
@RageAgainstTheMachine हाँ यह निश्चित रूप से कई पार निर्भरता के साथ तालिकाओं से है। मैं उपयोगकर्ताओं को इसे कई बार चलाने के लिए सूचित करना चाहता हूं, त्रुटियां समस्या नहीं हैं। पहली कमांड 3-4 बार और फिर दूसरी कमांड 1 बार और बीओएम चलाएं। यह आकर्षण की तरह काम करता है!
अल्पर

1
@KyleVassella हाँ, यह केवल उस डेटाबेस पर कार्य करेगा जिसमें आपका कंसोल खुला है
RageAgainstTheMachine

39

यदि आप टाइप नहीं करना चाहते हैं, तो आप इसके साथ स्टेटमेंट बना सकते हैं:

USE Databasename

SELECT  'DROP TABLE [' + name + '];'
FROM    sys.tables

फिर इसे चलाने के लिए एक नई SSMS विंडो में कॉपी और पेस्ट करें।


तालिका का नाम [] में लपेटा जाना चाहिए, लेकिन Azure पर भी महान काम करता है
Ondra

1
हम वह QUOTENAMEभी उपयोग कर सकते हैं जो साफ-सुथरा दिखता है। 'DROP TABLE ' + QUOTENAME(name) + ';'
पी .்

13

आप निम्न सहित सभी चीज़ों को छोड़ने के लिए निम्न स्क्रिप्ट का उपयोग कर सकते हैं:

  • गैर-सिस्टम संग्रहीत कार्यविधियाँ
  • विचारों
  • कार्यों
  • विदेशी प्रमुख बाधाओं
  • प्राथमिक कुंजी की कमी
  • टेबल

https://michaelreichenbach.de/how-to-drop-everything-in-a-mssql-database/

/* Drop all non-system stored procs */
DECLARE @name VARCHAR(128)
DECLARE @SQL VARCHAR(254)

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

WHILE @name is not null
BEGIN
    SELECT @SQL = 'DROP PROCEDURE [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Procedure: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] = 'P' AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

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

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

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

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

SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 ORDER BY [name])

WHILE @name IS NOT NULL
BEGIN
    SELECT @SQL = 'DROP FUNCTION [dbo].[' + RTRIM(@name) +']'
    EXEC (@SQL)
    PRINT 'Dropped Function: ' + @name
    SELECT @name = (SELECT TOP 1 [name] FROM sysobjects WHERE [type] IN (N'FN', N'IF', N'TF', N'FS', N'FT') AND category = 0 AND [name] > @name ORDER BY [name])
END
GO

/* Drop all Foreign 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 = 'FOREIGN 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 = 'FOREIGN 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 FK Constraint: ' + @constraint + ' on ' + @name
        SELECT @constraint = (SELECT TOP 1 CONSTRAINT_NAME FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS WHERE constraint_catalog=DB_NAME() AND CONSTRAINT_TYPE = 'FOREIGN 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 = 'FOREIGN KEY' ORDER BY TABLE_NAME)
END
GO

/* 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

9

मैं अभी @ NoDisplayName के कॉलम में उपयोग और उसके उत्तर में एक छोटा सा बदलाव करूँगा और कॉलम QUOTENAME()को एनक्लोज करना TABLE_NAMEभी शामिल करूँगा TABLE_SCHEMAजो dboस्कीमा में नहीं हैं ।

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([TABLE_SCHEMA]) + '.' + QUOTENAME([TABLE_NAME]) + ';'
FROM [INFORMATION_SCHEMA].[TABLES]
WHERE [TABLE_TYPE] = 'BASE TABLE';

EXEC SP_EXECUTESQL @sql;

या sysस्कीमा दृश्यों का उपयोग करके (@ स्वैसेक की टिप्पणी के अनुसार):

DECLARE @sql nvarchar(max) = '';

SELECT @sql += 'DROP TABLE ' + QUOTENAME([S].[name]) + '.' + QUOTENAME([T].[name]) + ';'
FROM [sys].[tables] AS [T]
INNER JOIN [sys].[schemas] AS [S] ON ([T].[schema_id] = [S].[schema_id])
WHERE [T].[type] = 'U' AND [T].[is_ms_shipped] = 0;

EXEC SP_EXECUTESQL @sql;

4
अगर मैं [sys]rdbms में पोर्टेबिलिटी की आवश्यकता नहीं है, तो मैं आमतौर पर स्कीमा के विचारों के साथ रहूँगा। stackoverflow.com/a/3654313/251174
swasheck

1
@swasheck उस लिंक के लिए धन्यवाद जो काफी दिलचस्प था। मैंने उत्तर को sys स्कीमा दृश्यों के उपयोग से हल किया है।
एयरोक्स


@NoDisplayName सिर्फ इसलिए कि आप कर सकते हैं , इसका मतलब यह नहीं है कि आप चाहिए ... blogs.sqlsentry.com/aaronbertrand/...
हारून बर्ट्रेंड

@AaronBertrand - मेरा बुरा सोचा कि यह एक बेहतर तरीका हो सकता है। इस पर ध्यान दिलाने के लिए धन्यवाद।
P P்

9

डेव.गग के जवाब के अनुवर्ती के रूप में, यह वह कोड होगा जो किसी को MySQL में सभी DROP टेबल लाइनों को प्राप्त करने की आवश्यकता होगी:

SELECT CONCAT('DROP TABLE ', TABLE_NAME, ';')
FROM INFORMATION_SCHEMA.tables
WHERE TABLE_SCHEMA = 'your_database_name'

2
मुझे पता है कि मूल पोस्टर ने प्रश्न को "sql-server" के साथ लेबल किया था, लेकिन यह MySQL में ऐसा करने वाले किसी व्यक्ति के लिए उपयोगी हो सकता है। वास्तव में मुझे यह सवाल तब मिला जब इस सवाल के लिए एक MySQL समाधान के लिए googling, इसलिए मैं अब उस समाधान को साझा कर रहा हूं जिसे मैं यहां एक उत्तर पढ़ने के बाद आया था।
ओएमए

7

सबसे सरल तरीका पूरे डेटाबेस को छोड़ना और इसे एक बार फिर से बनाना है:

drop database db_name
create database db_name

बस इतना ही।


1
:) कम से कम मेरे लिए सभी तालिकाओं को
छोड़ने

5
इस आदेश को कंपनी के डेटाबेस पर न चलाएं। या दूसरी नौकरी खोजने के लिए तैयार रहें।
फ़राज़

@FarazDurrani आसान आदमी, सभी तालिकाओं को छोड़ना PROD db के लिए किसी सौदे जैसा नहीं लगता।
पर्यवेक्षण

5

यदि किसी और को सर्वश्रेष्ठ उत्तर के समाधान (विदेशी कुंजियों को अक्षम करने सहित) के साथ कोई समस्या थी, तो यहां मेरा एक और समाधान है :

-- CLEAN DB
USE [DB_NAME]
    EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
    EXEC sp_MSForEachTable 'DELETE FROM ?'

    DECLARE @Sql NVARCHAR(500) DECLARE @Cursor CURSOR
    SET @Cursor = CURSOR FAST_FORWARD FOR

    SELECT DISTINCT sql = 'ALTER TABLE [' + 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

    EXEC sp_MSForEachTable 'ALTER TABLE ? WITH CHECK CHECK CONSTRAINT ALL'

3

बिलकुल 1 क्वेरी नहीं, फिर भी काफी छोटी और प्यारी:

-- 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

3

dropसभी के लिए निम्नलिखित स्क्रिप्ट का उपयोग करें constraints:

DECLARE @sql NVARCHAR(max)=''

SELECT @sql += ' ALTER TABLE ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) +    ' NOCHECK CONSTRAINT all; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

फिर सभी तालिकाओं को छोड़ने के लिए निम्न को चलाएँ:

select @sql='';

SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) + '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql

यह Azure SQL डेटाबेस में मेरे लिए काम करता है जहाँ 'sp_msforeachtable'उपलब्ध नहीं था!


1

मुझे पता है कि यह प्रश्न बहुत पुराना है, लेकिन हर बार मुझे इस कोड की आवश्यकता होती है .. वैसे यदि आपके पास टेबल और विचार और कार्य और प्रक्रियाएं हैं तो आप इसे इस स्क्रिप्ट द्वारा हटा सकते हैं .. तो मैं इस स्क्रिप्ट को क्यों पोस्ट करूं? क्योंकि यदि आप सभी तालिकाओं को हटाते हैं, तो आपको सभी दृश्यों को हटाने की आवश्यकता होगी और यदि आपके पास फ़ंक्शंस और प्रक्रियाएं हैं, तो आपको इसे भी हटाने की आवश्यकता है,
आशा है कि यह किसी की मदद करेगा

DECLARE @sql NVARCHAR(max)=''

 SELECT @sql += ' Drop table ' + QUOTENAME(TABLE_SCHEMA) + '.'+ QUOTENAME(TABLE_NAME) 
+ '; '
FROM   INFORMATION_SCHEMA.TABLES
WHERE  TABLE_TYPE = 'BASE TABLE'

Exec Sp_executesql @sql


 DECLARE @sql VARCHAR(MAX) = ''
    , @crlf VARCHAR(2) = CHAR(13) + CHAR(10) ;

 SELECT @sql = @sql + 'DROP VIEW ' + QUOTENAME(SCHEMA_NAME(schema_id)) + '.' + 
 QUOTENAME(v.name) +';' + @crlf
 FROM   sys.views v

 PRINT @sql;
 EXEC(@sql);

 declare @procName varchar(500)
 declare cur cursor 

 for select [name] from sys.objects where type = 'p'
 open cur
 fetch next from cur into @procName
 while @@fetch_status = 0
 begin
  exec('drop procedure [' + @procName + ']')
fetch next from cur into @procName
 end
  close cur
  deallocate cur

  Declare @sql NVARCHAR(MAX) = N'';

    SELECT @sql = @sql + N' DROP FUNCTION ' 
               + QUOTENAME(SCHEMA_NAME(schema_id)) 
               + N'.' + QUOTENAME(name)
    FROM sys.objects
  WHERE type_desc LIKE '%FUNCTION%';

   Exec sp_executesql @sql
  GO
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.