Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Неправильный синтаксис около конструкции  [new]
vanya_1234
Member

Откуда:
Сообщений: 11
Здравствуйте!
Нужно удалить записи в таблицах, где есть поле LogTime и значение его старые(1-2 месяца).
Вот код:
USE TPPDB;
DECLARE @day int = 10;
DECLARE @name_of_table nvarchar(100);
DECLARE @SQL nvarchar(100);-- = 'DELETE FROM ' +@name_of_table+' WHERE ''LogTime'' <= '+DATEADD(day, -@day , GETDATE());

DECLARE @CURSOR CURSOR
SET @CURSOR = CURSOR SCROLL
FOR
	SELECT TABLES.TABLE_NAME FROM information_schema.tables WHERE TABLE_TYPE='BASE TABLE'
OPEN @CURSOR
FETCH NEXT FROM @CURSOR INTO @name_of_table
	WHILE @@FETCH_STATUS = 0
		BEGIN
			IF((@name_of_table <>'userManagement_Users') 
				OR (@name_of_table<>'TableLifeTime') 
				OR (@name_of_table='SystemProperties') 
				OR (col_length(@name_of_table,'LogTime') is not null))
			BEGIN
				SET @SQL = 'DELETE FROM ' +@name_of_table+' WHERE LogTime <= '+CONVERT(VARCHAR, (DATEADD(day, -@day , GETDATE())),121)
				exec(@SQL)
				print @SQL
			END
		
			FETCH NEXT FROM @CURSOR INTO @name_of_table
		END;
CLOSE @CURSOR;

После выполнения скрипта вылезает вот такая ошибка:
Сообщение 102, уровень 15, состояние 1, строка 1
Неправильный синтаксис около конструкции "23".


Я чайник в mssql.
Может будут какие то советы по тому бреду, что выше?
Заранее благодарю!!!
4 окт 16, 23:56    [19744314]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
vanya_1234,
по моему дак кавычек не хватает
...
SET @SQL = 'DELETE FROM ' +@name_of_table+' WHERE LogTime <= '''+CONVERT(VARCHAR, (DATEADD(day, -@day , GETDATE())),121)+''''
				exec(@SQL)
....


или даже более того
...
SET @SQL = 'DELETE FROM ' +@name_of_table+' WHERE LogTime <= convert(datetime,'''+CONVERT(VARCHAR, (DATEADD(day, -@day , GETDATE())),121)+'''',121)'
				exec(@SQL)
....
5 окт 16, 00:31    [19744341]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
SET @SQL = 'DELETE FROM ' + quotename (@name_of_table) + ' WHERE LogTime <= @LogTime'
declare @LogTime datetime = DATEADD(day, -@day , GETDATE())

exec sp_executesql @sql, N'@LogTime datetime', @LogTime


Про DECLARE @SQL nvarchar(100) -- не надо объявлять строку запроса короче, чем максимально возможная длина таблицы.

Сообщение было отредактировано: 5 окт 16, 00:38
5 окт 16, 00:33    [19744344]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
leov
Member

Откуда: С-Петербург
Сообщений: 616
одну лишнюю кавычку воткнул
вот так правильнее будет
...
SET @SQL = 'DELETE FROM ' +@name_of_table+' WHERE LogTime <= convert(datetime,'''+CONVERT(VARCHAR, (DATEADD(day, -@day , GETDATE())),121)+''',121)'
				exec(@SQL)
....
5 окт 16, 00:35    [19744347]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А вообще, все это по-хорошему надо выкинуть, секционировать таблицы и транкейтить секциями. Хотя вопрос с редакцией сервера, да.
5 окт 16, 00:38    [19744348]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
vanya_1234
Member

Откуда:
Сообщений: 11
Спасибо всем за быстрые ответы!!!
Оба варианта мне подходят.
5 окт 16, 02:51    [19744388]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
кролик-зануда
Guest
vanya_1234
IF((@name_of_table <>'userManagement_Users') 
				OR (@name_of_table<>'TableLifeTime') 
				OR (@name_of_table='SystemProperties') 
				OR (col_length(@name_of_table,'LogTime') is not null))



жесть.
а ничего, что это выражение всегда истинно(с учетом того, что @name_of_table не Null) ?
5 окт 16, 09:33    [19744728]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
vanya_1234
Member

Откуда:
Сообщений: 11
кролик-зануда,

(col_length(@name_of_table,'LogTime') is not null)

мне нужно проверить, есть ли в в таблице @name_of_table столбец LogTime. Может это и не так делается, но тем не менее работает.
5 окт 16, 22:04    [19748332]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1913
vanya_1234,

Вам мягко намекнули что у вас скрипт будет запускаться для вообще любой таблицы, потому что у вас условие возвращает истину всегда:
 ('userManagement_Users' <> 'userManagement_Users' => false) OR ('userManagement_Users' <>'TableLifeTime' => true) ==> 1 | 0 == 1


или у вас во всех таблицах есть поле LogTime и вы везунчик или простите сударь - вы брешите что это работает.
ибо у вас скрипты для удаления записей должны были создастся для вообще всех таблиц бд, и вывалится в исключение при первом же скрипте удаления на таблице не содержащей данное поле.

declare @exe varchar(max) = ''

select @exe = @exe + 'DELETE FROM ' + QUOTENAME(SCHEMA_NAME(o.[schema_id])) +'.' + QUOTENAME(o.[name]) + ' WHERE [LogTime] <= ' + QUOTENAME(CONVERT(VARCHAR(8), GETDATE(), 112), CHAR(39)) + CHAR(13) + CHAR(10) + 'GO' + CHAR(13) + CHAR(10)
from [sys].[objects] o
    join [sys].[columns] c on c.[object_id] = o.[object_id] and c.[name] = 'LogTime'
where o.type = 'U'
  and o.[name] not in ('userManagement_Users', 'TableLifeTime')
group by o.[name], o.[schema_id]

print @exe
--exec (@exe)
5 окт 16, 23:21    [19748510]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
vanya_1234
Member

Откуда:
Сообщений: 11
felix_ff,

Тысячу извинений, я действительно поменял OR На AND
(@name_of_table <>'UserManagement_Users') 
				AND (@name_of_table<>'TableLifeTime') 
				AND (@name_of_table<>'SystemProperties') 
				AND (col_length(@name_of_table,'LogTime') is not null)
6 окт 16, 11:55    [19749751]     Ответить | Цитировать Сообщить модератору
 Re: Неправильный синтаксис около конструкции  [new]
vanya_1234
Member

Откуда:
Сообщений: 11
felix_ff,

Тысячу извинений, я действительно поменял OR На AND
(@name_of_table <>'UserManagement_Users') 
				AND (@name_of_table<>'TableLifeTime') 
				AND (@name_of_table<>'SystemProperties') 
				AND (col_length(@name_of_table,'LogTime') is not null)
6 окт 16, 11:57    [19749756]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить