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


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.