То, что вы опубликовали как попытку (в комментарии), просто не сработает.Давайте сначала отформатируем это, давайте:
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