एक क्वेरी में आम उपसर्ग के साथ कई तालिकाओं को कैसे छोड़ें?


17

मैं Microsoft SQL Server 2008 का उपयोग कर रहा हूं। मेरा सवाल है: एक क्वेरी में सामान्य उपसर्ग के साथ कई तालिकाओं को कैसे छोड़ें?

उस तालिका के नाम जैसा कुछ:

LG_001_01_STLINE, 
LG_001_02_STFICHE

जवाबों:


32

आप कैटलॉग दृश्यों का उपयोग करके एक स्ट्रिंग बना सकते हैं, जैसे:

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

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.name LIKE 'LG_001%';

PRINT @sql;
-- EXEC sp_executesql @sql;

बेशक, संभावित गोचर्स हैं, उदाहरण के लिए यदि इन तालिकाओं में विदेशी प्रमुख संबंध हैं, तो आपको या तो उन्हें पहले ड्रॉप करना होगा, या एक निश्चित क्रम में टेबल को छोड़ने के लिए आउटपुट की व्यवस्था करनी होगी।

केवल तालिकाओं की सूची प्राप्त करने के लिए, उपयोग करें:

SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

"एक निश्चित क्रम में तालिकाओं को छोड़ने के लिए आउटपुट की व्यवस्था करने" के बारे में याद रखने के लिए बहुत बहुत धन्यवाद!
sdlins

4

मैंने इस क्वेरी को फिर से चलाया और परिणामों को सभी विंडो को छोड़ने के लिए क्वेरी विंडो में वापस चिपका दिया:

SELECT 'DROP TABLE ' + NAME from sys.tables
ORDER BY NAME

यदि आप सभी तालिकाओं को हटाना चाहते हैं, लेकिन उन नामों को रखें जो A, B, C या D से शुरू हुए हैं:

SELECT 'DROP TABLE ' + NAME from sys.tables
WHERE NAME NOT LIKE '[ABCD]%'
GROUP BY NAME

-1

इससे आप अधिक संख्या में तालिकाओं को हटा सकते हैं।

declare 
@cursor as cursor, 
@FTABLE as varchar(500) 
set @cursor = CURSOR FOR 
select 'drop table ' + NAME + ';' 
from sys.tables 
where not SUBSTRING(NAME,10,3) in 
( 
'310', 
'311', 
'312', 
'313', 
'314', 
'320', 
'321', 
'322' 
) 
open @cursor 
fetch next from @cursor into @FTABLE 
while (@@FETCH_STATUS =0) 
begin 
        exec(@FTABLE) 
        print @FTABLE 
fetch next from @cursor into @FTABLE 
end 
close @cursor 
deallocate @cursor 

2
इससे बड़ा क्या? क्या आप अपनी एसक्यूएल को संशोधित कर सकते हैं ताकि यह एक सामान्य उपसर्ग के साथ तालिकाओं के लिए दिखे, जैसे ओपी ने पूछा था?
dezso

-1

मुझे यह पसंद है कि मैंने लिखा:

  DECLARE @chv_LG001_TableName nvarchar (100)
  DECLARE @chv_DROP_LG001_Tables nvarchar(100)
  DECLARE @chv_LG001_Table_Count int

  SET @chv_LG001_Table_Count = (SELECT count(OBJECT_NAME(id))
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%')

 IF @chv_LG001_Table_Count > 0
    BEGIN

    DECLARE  Drop_LG001_Tables_Cursor CURSOR FOR
      -- This query will give you the table list you are wanting
        SELECT OBJECT_NAME(id)
        FROM SYSINDEXES
        WHERE OBJECTPROPERTY(id,'isUserTable')=1 AND indid < 2
            and OBJECT_NAME(id) like 'LG_001%'

    OPEN Drop_LG001_Tables_Cursor
    FETCH NEXT FROM Drop_LG001_Tables_Cursor INTO @chv_LG001_TableName 
    WHILE @@FETCH_STATUS = 0 

    BEGIN           

    SET @chv_DROP_LG001_Tables = 'DROP TABLE ' + '[' + @chv_LG001_TableName + ']'

    --Print @chv_DROP_LG001_Tables 
-- Uncomment the next line when you are ready because it WILL clear out these tables. 
    --EXEC sp_executesql @chv_DROP_LG001_Tables

    FETCH NEXT FROM Drop_LG001_Tables_Cursor
    INTO @chv_LG001_TableName

    END

    CLOSE Drop_LG001_Tables_Cursor
    DEALLOCATE Drop_LG001_Tables_Cursor

END

2
इतने सारे मुद्दे यहां। (1) कर्सर मचान जटिल और अनावश्यक है। (२) जब आप फायरहॉस कर्सर का उपयोग करते हैं, तो आपको कम से कम उपयोग करना चाहिए STATICऔर / या LOCAL FAST_FORWARD] ( sqlperformance.com/2012/09/t-sql-queries/cursor-options )। (३) आपको पदावनत, पिछड़े हुए अनुकूलता जैसे विचारों का उपयोग नहीं करना चाहिए sysindexes। (4) आपकी स्क्रिप्ट मानती है कि सभी तालिकाएं dboस्कीमा में हैं (या इससे भी बदतर, निष्पादित उपयोगकर्ता का डिफ़ॉल्ट स्कीमा, जो हो भी नहीं सकता है dbo)।
हारून बर्ट्रेंड

-2

यह executeनिम्नानुसार किया जा सकता है :

declare @sql1 nvarchar(max) 
SELECT @sql1 =
 STUFF(
  (
    select ' drop table dbo.[' + name + ']'

FROM         sys.sysobjects AS sobjects
WHERE     (xtype = 'U') AND (name LIKE 'GROUP_BASE_NEW_WORK_%')
        for xml path('')
   ),
        1,1,'')

        execute sp_executesql @sql1

1
यह अनिवार्य रूप से एक भिन्नता है, लेकिन बिना किसी सुधार के स्वीकृत उत्तर पर। अंतर केवल इतना है कि आपने यह मान लिया है कि 1) डिफ़ॉल्ट स्कीमा माना जाता है dbo, और 2) नामों में कभी भी शामिल नहीं हो सकता है ]- दोनों ओपी के मामले में अच्छी तरह से सच हो सकते हैं लेकिन यह अभी भी एक अच्छा होगा उन मान्यताओं का उल्लेख करने के लिए विचार करें, क्योंकि उनके द्वारा अनुसरण करने वाले कैवेट अन्य लोगों के लिए पूरी तरह से स्पष्ट नहीं हो सकते हैं। फिर भी, जैसा कि मैंने शुरुआत में कहा था, इस उत्तर के साथ मेरा प्रमुख मुद्दा यह है कि यह किसी नए मूल्य को जोड़े बिना केवल पहले से मौजूद सुझाव को पुनर्स्थापित करता है।
एंड्री एम।

-3
SELECT s.name, t.name 
  FROM sys.tables AS t 
  INNER JOIN sys.schemas AS s 
  ON t.[schema_id] = s.[schema_id] 
  WHERE t.name LIKE 'LG_001%';

क्वेरी से ऊपर चलाएं और परिणामों को एक csv में सहेजें। फिर उस CSV को एक नोटपैड में खोलें। फिर DROP टेबल स्कीमा के साथ स्कीमा को बदलने के लिए Ctrl + H करें जो आपको सभी ड्रॉप क्वेश्चन देगा, इस बड़े sql को अपने sql टूल में कॉपी और पेस्ट करें

अगर आपके परिणाम हैं

myschema.table1
myschema.table2

प्रतिस्थापित करने के बाद, यह इस तरह दिखेगा

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 आप एक्सेल में कॉपी / पेस्ट क्यों करेंगे और ड्रॉप कमांड उत्पन्न करेंगे? आप इसे PRINTस्टेटमेंट का उपयोग करके आसानी से कर सकते हैं । आपका उत्तर उच्चतम मतदान वाले उत्तर से बेहतर कैसे है?
परिजन शाह
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.