하나의 쿼리에서 공통 접두사가있는 여러 테이블을 삭제하는 방법은 무엇입니까?


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
무엇보다 큽니까? OP가 요청한 것처럼 공통 접두사가있는 테이블을 찾도록 SQL을 수정할 수 있습니까?
— 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) firehose 커서를 사용할 때는 최소한 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.