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

Откуда:
Сообщений: 243
Собственно, мне кажется, простая вещь, но что-то не получается. Конкретно, проблема с подстановкой переменной типа datetime в динамический запрос в виде строки. Вот фрагмент этого запроса:
    declare @linkid nvarchar(16), @sg varchar(5), @date datetime, @datestr nvarchar(50)
    declare @Sqlcmd nvarchar(1000)
    declare @tbl_column_cur cursor

    set @Sqlcmd =
      N'set @curvar = cursor local scroll for select LINKID, SG, DATE from MyTable open @curvar';
    exec sp_executesql @SQLcmd, N'@curvar cursor output ', @curvar=@tbl_column_cur output 
    FETCH NEXT FROM @tbl_column_cur into @linkid, @SG, @date
    WHILE @@FETCH_STATUS = 0
    BEGIN
      set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)'    
      set @SqlCmd = 
        N'insert into SomeHTable (LinkID,SG,Date)' +
        'select LINKID = ''' + @linkid + ''', SG=' + @sg + ', Date = ' + @DateStr + 
        ' where not EXISTS(
            select * from AnotherHTable as H
            where (H.LinkID=''' + @LinkID + ''') and (H.SG=' + @SG + ') and
            (H.Date = ' + @DateStr + ')
        )'
      exec(@SqlCmd);     
      FETCH NEXT FROM @tbl_column_cur into @linkid, @SG, @date
    END
    close @tbl_column_cur
    deallocate @tbl_column_cur

Так вот, в строке, где я из переменной @date формирую переменную @DateStr для подстановки ее в результирующий динамический запрос, ругается что нельзя так присваивать. Оно и понятно, что так нельзя, но никак не соображу, как же это сделать. Прошу помощи.

ПС: предлагать отказаться от динамического запроса не надо, так как представленный мною кусок скрипта является сильно упрощенным по сравнению с реальным запросом.
5 фев 15, 11:23    [17221106]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Прошу помощи.

вместо exec(@SqlCmd) поставьте print @SqlCmd и узнайте, что же на текст вы там нагенерировали
5 фев 15, 11:28    [17221161]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Принтом выведе и посмотрите что у вас в даты попадает
5 фев 15, 11:28    [17221164]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
ПС: предлагать отказаться от динамического запроса не надо, так как представленный мною кусок скрипта является сильно упрощенным по сравнению с реальным запросом.

Даже в этом примере нет ни одного признака необходимости динамического запроса
5 фев 15, 11:29    [17221176]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
harisma
set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)'    

И что ето за формат даты такой ??
Сделайте обычную 'yyyymmdd' и серверу и вам будет счастье
5 фев 15, 11:30    [17221181]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
 set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)'    

И "ругается что нельзя так присваивать." наверное на это, а не на динамический запрос
5 фев 15, 11:32    [17221198]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
harisma
Member

Откуда:
Сообщений: 243
Maxx
harisma
set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)'    

И что ето за формат даты такой ??
Сделайте обычную 'yyyymmdd' и серверу и вам будет счастье


Если так написано, значит так нужно. И это действительно нужно для бизнес-логики проекта, где это используется. В результате получается значение даты на 1 число месяца.
5 фев 15, 11:34    [17221213]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
harisma
Member

Откуда:
Сообщений: 243
Glory
harisma
 set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)'    

И "ругается что нельзя так присваивать." наверное на это, а не на динамический запрос


Ну конечно же, что на это. Но разве "это" не является частью динамического запроса?
Вот и прошу подсказать, как это правильно сделать.
5 фев 15, 11:36    [17221226]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Если так написано, значит так нужно.

Хорошая логика. Если мне нужно, то мне плевать на правила.
Вы точно понимаете, что вы присваиваете в set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)' ?
5 фев 15, 11:36    [17221230]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Ну конечно же, что на это. Но разве "это" не является частью динамического запроса?

Вы будете удивлены, но не является
Потому что присвоение переменной @dateStr значения не может быть частью динамического запроса.
Который находится соврешенно в другой переменной
5 фев 15, 11:38    [17221240]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
harisma
Member

Откуда:
Сообщений: 243
Glory
harisma
Если так написано, значит так нужно.

Хорошая логика. Если мне нужно, то мне плевать на правила.
Вы точно понимаете, что вы присваиваете в set @dateStr = 'convert(datetime, Str(Year(' + @Date + '), 4) + ''-'' + Str(Month(' + @Date + '), 2) + ''-1'', 21)' ?


Я точно знаю, что мне надо получить. Мне надо получить например из исходного @date = 2015.02.05 11:38:45.369 в результирующем запросе сравнение с датой '2015-02-1 00:00:00.000' и вставку этого значения в таблицу SomeHTable
5 фев 15, 11:41    [17221261]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Я точно знаю, что мне надо получить.

Вопрос был про то, знаете ли вы, что вы присваиваете в переменную @dateStr.
5 фев 15, 11:44    [17221283]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
harisma
датой '2015-02-1 00:00:00.000'

ЕТО вообще не дата.. вы хоть ето понимаете ?
5 фев 15, 11:44    [17221289]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
в тупую должно быть чето такое
set @dateStr = LEFT(CONVERT(nvarchar(10), @date, 121), 8) +'01 00:00.000'
5 фев 15, 11:48    [17221326]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
harisma
Member

Откуда:
Сообщений: 243
Maxx
harisma
датой '2015-02-1 00:00:00.000'

ЕТО вообще не дата.. вы хоть ето понимаете ?

Ну, один нолик потерял в строке перед единичкой. Функция convert вернет то, что мне надо, дату 2015-02-01 00:00:00.000
5 фев 15, 11:48    [17221333]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
и как правильно сказал Glory - курсор здесь нужен как мертвому припарка..решаеться 1 селектом
5 фев 15, 11:51    [17221357]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
harisma,

Все ваши приседания с курсорами и динамикой заменяются на банальное
insert into (LinkID,SG,Date)
select
 LINKID, SG, d.[DATE]
from
 MyTable t cross apply
 (select cast(dateadd(day, -day([DATE]) + 1, [DATE]) as date)) d([DATE])
where
 not exists(select * from AnotherHTable where LINKID = t.LINKID and SG = t.SG and [DATE] = d.[DATE]);
5 фев 15, 11:52    [17221375]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
Glory
Member

Откуда:
Сообщений: 104751
harisma
Ну, один нолик потерял в строке перед единичкой. Функция convert вернет то, что мне надо, дату 2015-02-01 00:00:00.000

Только вот слово convert внутри кавычек - это уже не функция и ничего вам не вернет.
5 фев 15, 11:56    [17221402]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
harisma
Member

Откуда:
Сообщений: 243
Glory,
Все. Вопрос закрыт. Все получилось. Я сделал вот так в теле курсора:
      set @dateStr = convert(varchar, convert(datetime, Str(Year(@Date), 4) + '-' + Str(Month(@Date), 2) + '-1', 21), 121)    
      set @SqlCmd = 
        N'insert into SomeHTable (LinkID,SG,Date)' +
        'select LINKID = ''' + @linkid + ''', SG=' + @sg + ', Date = ''' + @DateStr + ''' where not EXISTS(
            select * from AnotherHTable as H
            where (H.LinkID=''' + @LinkID + ''') and (H.SG=' + @SG + ') and (H.Date = ''' + @DateStr + ''')
            )'
      exec(@sqlcmd)


Правильно?
5 фев 15, 12:29    [17221679]     Ответить | Цитировать Сообщить модератору
 Re: Прошу помощи по динамическому запросу  [new]
LexusR
Member

Откуда: Novosibirsk
Сообщений: 1887
правильно как вам написал invm
insert into SomeHTable (LinkID,SG,Date)
select
 LINKID, SG, d.[DATE]
from
 MyTable t cross apply
 (select cast(dateadd(day, -day([DATE]) + 1, [DATE]) as date)) d([DATE])
where
 not exists(select * from AnotherHTable where LINKID = t.LINKID and SG = t.SG and [DATE] = d.[DATE]);
5 фев 15, 13:42    [17222415]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить