Как выбрать значение table_name из одной таблицы и удалить записи из таблицы table_name на основе условия? - PullRequest
0 голосов
/ 15 мая 2018

У нас есть стол. Давайте назовем это Table_A. Table_A содержит набор имен таблиц и числовых значений, связанных с каждым именем таблицы. Обратитесь к рисунку ниже

Example

Может кто-нибудь помочь мне написать запрос: Выберите table_names из TABLE_A один за другим; перейдите к этой таблице, проверьте Date_inserted каждой записи против NO_OF_DAYS в Table_A и, если запись старше, чем NO_OF_DAYS в Table_A, затем УДАЛИТЕ ЭТУ ЗАПИСЬ из этой конкретной таблицы.

Полагаю, нам нужно создать динамические значения для этого запроса, но мне трудно.

Итак, на рисунке выше, запрос должен:

  1. Выберите первое имя таблицы (T_Table1) из Table_A
  2. Перейти к этой таблице (T_Table1)
  3. Проверьте дату вставки каждой записи в (T_Table1) в соответствии с условием
  4. Если условие (IF-запись было вставлено до NO_OF_DAYS, что в данном случае составляет 90, ТО удалите запись; В противном случае перейдите к следующему запись)
  5. Перейти к следующей таблице (T_Table2) в Table_A
  6. Продолжать до тех пор, пока все имена таблиц в Table_A не будут выполнены

1 Ответ

0 голосов
/ 15 мая 2018

То, что вы опубликовали как попытку (в комментарии), просто не сработает.Давайте сначала отформатируем это, давайте:

SET SQL = '
DELETE [' + dbo + '].[' + TABLE_NAME + '] 
where [Date_inserted ] < '
SET SQL = SQL + ' convert(varchar, DATEADD(day, ' + CONVERT(VARCHAR, NO_OF_DAYS) + ',' + '''' + CONVERT(VARCHAR, GETDATE(), 102) + '''' + '))'
PRINT SQL
EXEC (SQL) 

Во-первых, я на самом деле понятия не имею, что вы даже пытаетесь сделать здесь.У вас есть такие вещи, как [' + dbo + '], что означает, что вы ссылаетесь на столбец dbo;поскольку вы используете SET, тогда столбец dbo не может существовать.Кроме того, переменные имеют префикс @ в SQL Server;у вас их нет.

В любом случае, решение.Кому-то это может не понравиться, поскольку я использую CURSOR, а не делаю все сразу.У меня, однако, есть свои причины.A CURSOR на самом деле не «плохая» вещь, как многие верят;проблема в том, что люди постоянно используют их неправильно.Например, использование CURSOR для циклического просмотра записей и создания иерархии - ужасная идея;Есть гораздо лучшие подходы к набору данных.

Итак, каковы мои причины?Во-первых, я могу параметризовать динамический SQL;это будет сложнее вне CURSOR, так как мне нужно будет объявлять разные параметры для каждого DELETE.Кроме того, с CURSOR, если DELETE терпит неудачу на одном столе, это не будет на других;один длинный кусок динамического SQL будет означать, что если одна из транзакций потерпит неудачу, все они будут откатаны.Кроме того, в зависимости от размера удаляемых, это может быть очень большим DELETE.

Важно, однако, вы понимаете, что я здесь сделал;если вы этого не сделаете, это проблема сама по себе.Что произойдет, если вам понадобятся проблемы в будущем?Так что это не сайт для такой поддержки;вам нужно поддерживать свой собственный код.Если вы не можете понять код, который вы дали, не используйте его или изучите, что он делает в первую очередь (или вы делаете не то, что нужно).

Примечание. Я использую свои собственные объекты при отсутствии данных расходного образца:

CREATE TABLE TableOfTables (TableName sysname,
                            NoOfDays int);
GO

INSERT INTO TableOfTables
VALUES ('T1',10),
       ('T2',15),
       ('T3',5);
GO


DECLARE Deletes CURSOR FOR
SELECT TableName, NoOfDays
FROM TableOfTables;

DECLARE @SQL nvarchar(MAX), @TableName sysname, @Days int;

OPEN Deletes;

FETCH NEXT FROM Deletes
INTO @TableName, @Days;

WHILE @@FETCH_STATUS = 0 BEGIN

    SET @SQL = N'DELETE FROM ' + QUOTENAME(@TableName) + NCHAR(10) +
               N'WHERE DATEDIFF(DAY, InsertedDate, GETDATE()) >= @dDays;'
    PRINT @SQL; --Say hello to your best friend. o/
    --EXEC sp_executeSQL @SQL, N'@dDays int', @dDays = @Days; --Uncomment to run

    FETCH NEXT FROM Deletes
    INTO @TableName, @Days;
END

CLOSE Deletes;
DEALLOCATE Deletes;    

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