Sql 对“我的代码”中后续动态查询中使用的变量使用动态值

Sql 对“我的代码”中后续动态查询中使用的变量使用动态值,sql,sql-server,variables,dynamicquery,Sql,Sql Server,Variables,Dynamicquery,当set@ToDate='20200311'时,即当我对特定日期进行硬编码时,此代码起作用,但当我希望此代码一直执行到当前日期时,此代码不起作用 行集合@ToDate=select..getdate。。抛出错误,你能帮我解决并告诉我应该做些什么来纠正吗 While @@Fetchstatus =0, begin set @Fromdate = '20180102'; set @ToDate = select convert (varchar, getdate(), 112);

当set@ToDate='20200311'时,即当我对特定日期进行硬编码时,此代码起作用,但当我希望此代码一直执行到当前日期时,此代码不起作用

行集合@ToDate=select..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

您可以将其表述为不带动态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);
我强烈建议您采用这种或类似的方法。

如果Gordon的答案是正确的,那么更好的方法是不使用任何类型的递归。SQL Server是为基于集合的方法而设计的,因此您应该真正使用一种方法

这里需要的方法是一个计数,它不是递归的,并且不像rCTE那样默认限制为100个循环,因为它不循环:


只是另一个带有特别理货/数字表的选项

范例

为INSERT生成以下命令


. 参数化你的语句,不要注入变量。它还会抛出什么错误?给我们详细信息…不清楚为什么需要循环。如果您提供了示例数据和期望的结果,可能也不太清楚为什么这里需要动态sql;您可以在循环中有一个相当基本的insert查询。@DaleK它抛出一个错误,表示我的语法中有问题。为什么是rCTE?2018年至今,已超过700个回路;这真的不比一段时间好多少。理货会快得多。顾名思义,rCTE仍然是递归的一种形式;就像一个循环。@Larnu。一次查询比一次查询好得多。诚然,比较是不同的,但是递归CTE具有非常合理的性能——比数字表稍差一点——但对于大多数问题来说完全合理。下面是一个例子:。我不同意。rCTE是一种非常缓慢的方法。计数要快得多。但是今天的日期不是固定的。如果它是固定的,那么当我给出一个值时,查询工作正常。但是当我想生成到当前日期的动态查询时,我面临着一个问题。今天当我自动运行时,它应该选择今天的系统日期作为“截止日期”,明天它应该选择“明天的日期”,依此类推。@Berry我猜Date2=castgetdate作为date@Berry第二个日期列是否应为dateaddDAY,1,D?同样,如果没有样品,很难确定实际结果
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;
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