วิธีการวางหลายตารางด้วยคำนำหน้าทั่วไปในหนึ่งแบบสอบถาม?


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;

แน่นอนว่ามี gotchas ที่อาจเกิดขึ้นเช่นถ้าตารางเหล่านี้มีความสัมพันธ์กับคีย์ต่างประเทศคุณจะต้องวางมันก่อนหรือจัดเรียงผลลัพธ์เพื่อวางตารางในลำดับที่แน่นอน

หากต้องการรับรายการตารางให้ใช้:

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
ยิ่งใหญ่กว่าอะไร คุณสามารถปรับเปลี่ยน SQL ของคุณเพื่อให้มองหาตารางที่มีคำนำหน้าทั่วไปเช่น OP ขอหรือไม่
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) การเลื่อนเคอร์เซอร์นั้นซับซ้อนและไม่จำเป็น (2) เมื่อคุณใช้เคอร์เซอร์ดับเพลิงคุณควรใช้อย่างน้อยSTATICและ / หรือLOCAL FAST_FORWARD] ( sqlperformance.com/2012/09/t-sql-queries/cursor-options ) (3) sysindexesคุณไม่ควรใช้เลิกใช้มุมมองที่เหมือนกันได้ย้อนหลัง (4) สคริปต์ของคุณสมมติว่าตารางทั้งหมดอยู่ในdboสคีมา (หรือแย่กว่านั้นคือสคีมาเริ่มต้นของผู้ใช้ที่เรียกใช้งานซึ่งอาจจะไม่ใช่dbo)
Aaron Bertrand

-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)ชื่อไม่สามารถมี]- ซึ่งทั้งสองอย่างนี้อาจจะเป็นจริงในกรณีของ OP แต่มันจะยังคงดี ความคิดที่จะพูดถึงสมมติฐานเหล่านั้นเนื่องจากคำเตือนที่ตามมาอาจไม่ชัดเจนสำหรับผู้อื่น อย่างที่ฉันได้กล่าวไว้ในตอนต้นปัญหาหลักของฉันกับคำตอบนี้ก็คือมันเพิ่งจะคืนคำแนะนำที่มีอยู่แล้วโดยไม่ต้องเพิ่มค่าใหม่ใด ๆ
Andriy M

-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 นั้นในแผ่นจดบันทึก จากนั้นทำ Ctrl + H เพื่อแทนที่สคีมาด้วย DROP Table SCHEMA ที่จะให้แบบสอบถามแบบเลื่อนทั้งหมดคัดลอกและวาง sql ขนาดใหญ่นี้ลงในเครื่องมือ sql ของคุณและดำเนินการ

ถ้าผลลัพธ์ของคุณคือ

myschema.table1
myschema.table2

หลังจากแทนที่มันจะมีลักษณะเช่นนี้

DROP TABLE MYSCHEMA.TABLE1
DROP TABLE MYSCHEMA.TABLE2

-1 ทำไมคุณต้องคัดลอก / วางใน Excel และสร้างคำสั่งปล่อย คุณสามารถทำได้โดยใช้PRINTคำสั่ง คำตอบของคุณดีกว่าคำตอบที่ได้รับคะแนนสูงสุดอย่างไร
Kin Shah
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.