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

Откуда:
Сообщений: 31
Запрос на удаление передается в виде строки:

(переменная @a объявлена как варчар)

select  @a=    'delete from '+ s.name + '.' + t.name + ' where ' + c.name + ' >= ''' + convert(varchar(20), @datefrom, 104) 
from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.columns c on c.object_id = t.object_id and c.name = 'tDate'
where s.name + '.' + t.name = 'get.t_Period'


Но проблема в том, что поле tDate в таблице t_Period целого типа int, я при вызове процедуры на удаление, данные не удаляются из этой табл.
Есть 2 пути решения этой проблемы:
1) Закастить поле tDate в таблице на варчар, потому что происходит конверт вводимой даты на варчар:
convert(varchar(20), @datefrom, 104) 

2) Если возможно переписать запрос так, чтобы не менять тип поля в таблице, но запрос delete надо передавать в виде строки

Может еще предложите варианты решения, буду рад за помощь! Спасибо!
26 апр 21, 16:38    [22314591]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с системными объектами  [new]
komrad
Member

Откуда:
Сообщений: 5677
Дмитрий86

Может еще предложите варианты решения, буду рад за помощь! Спасибо!



+ анализировать тип данных?
select  @a='delete from '+ s.name + '.' + t.name + ' where ' + c.name + ' >= ' + iif(c.system_type_id in (56),convert(varchar(20), @datefrom, 112),''''+convert(varchar(20), @datefrom, 104)+'''')  
from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.columns c on c.object_id = t.object_id and c.name = 'tDate'
where s.name + '.' + t.name = 'get.t_Period'
26 апр 21, 17:23    [22314622]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с системными объектами  [new]
AlexDv
Member

Откуда: SPb
Сообщений: 2
Дмитрий86,

select  @a=    'delete from '+ s.name + '.' + t.name + ' where ' + c.name + ' >=  ''convert(varchar(20), @datefrom, 104)'' from sys.tables t
inner join sys.schemas s on t.schema_id = s.schema_id
inner join sys.columns c on c.object_id = t.object_id and c.name = tDate
where ' + s.name + '.' + t.name + '= get.t_Period'


Сообщение было отредактировано: 26 апр 21, 18:10
26 апр 21, 18:11    [22314663]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с системными объектами  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 8587
Дмитрий86,

напишите для таблицы t_Period отдельный запрос. Лучше же избавиться от такого решения.
26 апр 21, 22:21    [22314776]     Ответить | Цитировать Сообщить модератору
 Re: Запрос с системными объектами  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
Дмитрий86,

а нафига вы извращаетесь с метаданными если у вас связка sys.tables + sys.schemas + sys.columns вернет все равно одну строку из за ваших предикатов?

предложу банальное:

declare @a varchar(4000) = formatmessage(N'delete from [get].[t_Period] where [tDate] >= %s', quotename(convert(varchar, @datefrom, 112), char(39)));
26 апр 21, 22:30    [22314783]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить