【问题标题】:update with dynamic SQL [duplicate]使用动态 SQL 更新 [重复]
【发布时间】:2021-05-10 00:50:37
【问题描述】:

我将解释我的问题,我使用 AdventureWorksDW2012 数据库来展示我的目的。我想根据该表中 CurrencyID = 'CNY' 的最大日期更新表 但我收到错误Conversion failed when converting date and/or time from character string. 我知道错误,因为我使用动态 SQL 语句,但我应该将它与游标一起使用..有关此问题的任何帮助 这是我的代码

SET NOCOUNT ON 
DECLARE
        
       @AverageRate  float 
      ,@CurrencyID  NVARCHAR(50)
      ,@CurrencyDate  DATE
      ,@EndOfDayRate  float
      ,@CurrencyKey  float
      ,@DateKey  float
      ,@MaxDate nvarchar(max)



  Declare update_cursor
CURSOR 
FOR
(select DISTINCT  AverageRate
      ,CurrencyID
      ,CurrencyDate
      ,EndOfDayRate
      ,CurrencyKey
      ,DateKey from dbo.NewFactCurrencyRate1 );
OPEN update_cursor

FETCH NEXT FROM update_cursor INTO
       @AverageRate
      ,@CurrencyID
      ,@CurrencyDate
      ,@EndOfDayRate
      ,@CurrencyKey
      ,@DateKey

WHILE ( @@FETCH_STATUS = 0)
BEGIN
if @CurrencyID = 'CNY'
begin
set @MaxDate = 'select max(CurrencyDate) from  dbo.NewFactCurrencyRate1 '
EXEC (@MaxDate)
end

update dbo.NewFactCurrencyRate1
set CurrencyDate = @MaxDate
 where CurrencyID = 'CNY'


FETCH NEXT FROM update_cursor INTO
@AverageRate
    ,@CurrencyID
      ,@CurrencyDate
      ,@EndOfDayRate
      ,@CurrencyKey
      ,@DateKey
END
CLOSE update_cursor
DEALLOCATE update_cursor

【问题讨论】:

    标签: sql sql-server dynamic sql-update


    【解决方案1】:

    到目前为止,我从移动视图中可以理解的是,您将 @maxdate 声明为 nvarchar,但尝试使用它来存储和更新日期字段。请使用日期数据类型。

    @MaxDate 日期

    【讨论】:

    • 我尝试使用 date 但它只被接受 nvarchar
    • dbo.NewFactCurrencyRate1 的 currencydate 字段的数据是什么?
    【解决方案2】:

    您正试图“双重使用”@MaxDate 字符串。在一个地方,您使用它来保存您尝试运行的 SQL,而在另一个地方,您尝试(但未能)让它保存应该是执行该 SQL 的输出。

    我会将它们声明为两个变量:

    @DynamicSQL nvarchar(max)
    @MaxDate date
    

    然后替换:

    set @MaxDate = 'select max(CurrencyDate) from  dbo.NewFactCurrencyRate1 '
    EXEC (@MaxDate)
    

    set @DynamicSQL = 'SET @MaxDate = (select max(CurrencyDate)
                                       from  dbo.NewFactCurrencyRate1)'
    EXEC (@DynamicSQL)
    

    【讨论】:

    • 我将它用于我的目的..因为在我的真实场景中我有变量@tablename,它存储了我从中获得最大时间戳的表的列表
    • 如果我在没有 sql dynamic 的情况下使用它,我得到了错误。` set @table = 'dbo.NewFactCurrencyRate1' set @MaxDate = (select max(CurrencyDate) from @table)`
    • 为多次提交道歉,我一直不小心触发了提交的键盘快捷键。希望我所说的有道理,您可以根据自己的需要进行调整。
    • 我实际上不确定我给出的代码是否有效,因为我认为这不会在调用上下文中设置变量。这个 SO 可能会有所帮助:stackoverflow.com/questions/6968512/…
    猜你喜欢
    • 1970-01-01
    • 2014-10-20
    • 2017-05-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多