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