Удалить несколько таблиц со строкой - PullRequest
2 голосов
/ 05 января 2010

У меня есть таблицы типа lg-010-a ..., lg-010-ac ... и т. Д. У меня есть база данных abc,

У меня есть командное окно:

drop table from abc where Table_Name like 'lg-010-%'

При этом будут удалены все таблицы, начиная с lg-010 -?

Ответы [ 4 ]

4 голосов
/ 05 января 2010

Попробуйте что-то вроде этого:

declare @sql varchar(max)
declare @tablenames varchar(max)

select @tablenames = coalesce(@tablenames + ', ','') + Table_Name from INFORMATION_SCHEMA.TABLES    
where Table_Name like ('lg-010-%')

set @sql = 'drop table ' + @tablenames

exec (@sql)

Это запрашивает таблицу INFORMATION_SCHEMA.TABLES, чтобы получить имена таблиц, которые соответствуют вашим критериям, а затем объединяет их вместе в строку с разделителями-запятыми.

Эта строка добавляется к оператору 'Drop table' и выполняется.

Drop table может принимать несколько имен таблиц, разделенных запятыми.

(у меня изначально был этот запрос sys.tables, но некоторые исследования показали, что, хотя в настоящее время они эквивалентны, метод Information_Schema гарантированно будет работать в будущих версиях)

1 голос
/ 20 июня 2013

К сожалению, вы не можете сделать это так. Один из способов:

SELECT 'DROP TABLE ' + name FROM sysobjects WHERE name LIKE '%lg-010-a%' AND [type] IN ('P')

Это просто распечатает инструкцию DROP TABLE для каждой таблицы - вы можете скопировать и вставить этот вывод и запустить его. Вы можете просто поместить EXECUTE в цикл вместо PRINT, но я сделал это таким образом, чтобы вы могли увидеть, что происходит / сначала проверить вывод.

0 голосов
/ 17 мая 2018
CREATE PROCEDURE dbo.drop_MsSqlTables1 @createDate smalldatetime

AS

declare @flag int =1

declare @tname varchar(50)

declare @sql varchar(max)

select row_number() over (order by name) as num, '[dbo].[' + name +']' as table_name into #temp from sys.tables where name like ('EmpInfo_%') and create_date<@createDate

declare @count int = (select count(*) from #temp)

select * from #temp

while @flag <= @count

    begin

     set @tname = (select table_name from #temp where num = @flag)

     set @sql = 'drop table ' + @tname 

     exec (@sql)

     set @flag = @flag+1
    end
0 голосов
/ 05 января 2010

К сожалению, вы не можете сделать это так. Один из способов:

DECLARE @TableName NVARCHAR(128)
SELECT TOP 1 @TableName = TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME LIKE 'lg-010-%'
ORDER BY TABLE_NAME ASC

WHILE (@@ROWCOUNT > 0)
    BEGIN
        PRINT 'DROP TABLE [' + @TableName + ']'

        SELECT TOP 1 @TableName = TABLE_NAME
        FROM INFORMATION_SCHEMA.TABLES
            WHERE TABLE_NAME LIKE 'lg-010-%'
            AND TABLE_NAME > @TableName
        ORDER BY TABLE_NAME ASC 
    END

Это просто распечатает инструкцию DROP TABLE для каждой таблицы - вы можете скопировать и вставить этот вывод и запустить его. Вы можете просто поместить EXECUTE в цикл вместо PRINT, но я сделал это таким образом, чтобы вы могли увидеть, что происходит / сначала проверить вывод.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...