답변:
카탈로그 뷰를 사용하여 문자열을 작성할 수 있습니다. 예 :
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%';
이를 통해 훨씬 더 많은 테이블을 삭제할 수 있습니다.
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
문장 을 사용하여 쉽게 할 수 있습니다 . 귀하의 답변이 가장 높은 투표 응답보다 어떻게 낫습니까?