Используйте значение Dynami c для переменной, которая используется в последующем запросе Dynami c в моем коде - PullRequest
1 голос
/ 11 марта 2020

Этот код работает, когда установлено @ToDate = '20200311', т.е. когда я жестко задал указанную дату c, но не работает, когда я хочу, чтобы это всегда выполнялось до текущей даты

Строка установлена @ToDate = выберите ..... getdate .. выдает ошибку, не могли бы вы помочь мне и скажите мне, что я должен сделать, чтобы исправить?

While @@Fetchstatus =0,

begin 
  set @Fromdate = '20180102';
  set @ToDate = select convert (varchar, getdate(), 112);

  while (@Fromdate < @ToDate) begin
         set @StrQuery = 'INSERT into dbo.Tmp_M_Rates (Rate_Date, Rate_D, Entity, cur) values ('
                         +''''+ CAST (@FromDate AS nvarchar) + ''', ''' + Substring (CONVERT (VARCHAR 
                         (10), @Fromdate, 112),3,8) + ''', ''' + @EntityName + ''', ''' + @Cur + 
                          ''')'
      EXEC (@StrQuery)

      set @Fromdate = dateadd(DAY,1,@Fromdate)
end

Ответы [ 3 ]

1 голос
/ 11 марта 2020

Если в ответе Гордона правильная идея, гораздо лучше было бы не использовать какой-либо тип рекурсии. SQL Сервер разработан для методов, основанных на множествах, и поэтому вам действительно следует использовать один из них.

Здесь вам нужен метод Tally, который не является рекурсивным и не ограничен 100 циклами по умолчанию (как rCTE), потому что не l oop:

DECLARE @FromDate date = '20180102';

WITH N AS(
    SELECT N
    FROM (VALUES(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL),(NULL))N(N)),
Tally AS(
    SELECT TOP (DATEDIFF(DAY,@FromDate, GETDATE())+1)
           ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS I
    FROM N N1, N N2, N N3), --1000 rows, add more cross joins to N for more rows
Dates AS(
    SELECT DATEADD(DAY, T.I, @FromDate) AS D
    FROM Tally T)
INSERT INTO dbo.Tmp_M_Rates (Rate_Date, Rate_D, Entity, cur)
SELECT D,
       SUBSTRING(CONVERT(VARCHAR(10), @Fromdate, 112), 3, 8),
       @EntityName,
       @Cur
FROM Dates;
0 голосов
/ 11 марта 2020

Просто еще один вариант с ad-ho c Таблица подсчета / чисел

Пример

Declare @Date1 date = '2018-01-02'
Declare @Date2 date = getdate()
Declare @Entity varchar(50) ='Entity Name'
Declare @Cur    varchar(50) ='USD'

--INSERT into dbo.Tmp_M_Rates (Rate_Date, Rate_D, Entity, cur) 
Select Rate_Date = D
      ,Rate_D    = dateadd(DAY,1,D)
      ,Entity    = @Entity
      ,Cur       = @Cur
 From (
         Select Top (DateDiff(DAY,@Date1,@Date2)+1) 
               D=DateAdd(DAY,-1+Row_Number() Over (Order By (Select Null)),@Date1) 
         From  master..spt_values n1,master..spt_values n2
      ) A

Генерирует следующее для INSERT

enter image description here

0 голосов
/ 11 марта 2020

Вы можете сформулировать это как один запрос без динамических значений c SQL:

WITH dates as (
      SELECT CONVERT(date, '20180102') as dte
      UNION ALL
      SELECT dateadd(day, 1, dte)
      FROM CTE
      WHERE dte <= GETDATE()
     )
INSERT into dbo.Tmp_M_Rates (Rate_Date, Rate_D, Entity, cur)
    SELECT dte, SUBSTRING(CONVERT(VARCHAR(10), @Fromdate, 112), 3, 8),
           @EntityName, @Cur
    FROM dates
    OPTION (MAXRECURSION 0);

Я настоятельно рекомендую использовать этот или аналогичный подход.

...