【问题标题】:Error converting data type varchar to bigint. in update将数据类型 varchar 转换为 bigint 时出错。更新中
【发布时间】:2017-01-02 09:11:08
【问题描述】:

我收到以下错误:

将数据类型 varchar 转换为 bigint 时出错。

在执行以下查询时:

declare @MaxSizeMB BIGINT
set @MaxSizeMB = 50

DECLARE @Query varchar(8000)='' 

set @Query = 'UPDATE SPMC
              SET SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
              FROM PWI
              INNER JOIN SI ON SI.Id = PWI.SourceItemId
              INNER JOIN SPMC ON SPMC.SourceItemId = SI.Id
                              AND SI.ItemSize > ' + CAST(@MaxSizeMB AS bigint) + ' * 1024 * 1024 '  

print (@Query)   

【问题讨论】:

  • 为什么要创建查询字符串而不是在实际查询中使用变量?

标签: sql-server tsql sql-update dynamic-sql


【解决方案1】:

您没有从查询中计算@MaxSizeMB x 1024 x 1024,而是将结果连接到您的查询中,如下所示:

declare @MaxSizeMB BIGINT
set @MaxSizeMB = 50*1024*1024

DECLARE @Query varchar(8000)='' 

set @Query=            
'Update SPMC
Set SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
FROM PWI
INNER JOIN SI on SI.Id = PWI.SourceItemId
INNER JOIN SPMC on SPMC.SourceItemId = SI.Id
AND SI.ItemSize > '+ cast(@MaxSizeMB as varchar(max)) 

print (@Query)   

您也可以在不使用动态 SQL 的情况下获得相同的结果。如下:

Update SPMC
Set SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
FROM PWI
INNER JOIN SI on SI.Id = PWI.SourceItemId
INNER JOIN SPMC on SPMC.SourceItemId = SI.Id
AND SI.ItemSize > (@MaxSizeMB *1024*1024)

【讨论】:

    【解决方案2】:

    试试这个:

     declare @MaxSizeMB BIGINT
    set @MaxSizeMB = 50
    DECLARE @Query varchar(8000)='' 
    
    set @Query=            
    'Update SPMC
    Set SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
    FROM PWI
    INNER JOIN SI on SI.Id = PWI.SourceItemId
    INNER JOIN SPMC on SPMC.SourceItemId = SI.Id
    AND SI.ItemSize > '+ cast(cast(@MaxSizeMB as bigint) as varchar(max)) +' * 1024 * 1024 '  
    
    print (@Query)
    

    【讨论】:

      【解决方案3】:

      由于MaxSizeMB已经是BIGINT,将其转换为BIGINT将无效,您应该将计算值转换为varchar(max)

      declare @MaxSizeMB BIGINT
      set @MaxSizeMB = 50
      
      DECLARE @Query varchar(8000)='' 
      
      set @Query=            
      'Update SPMC
      Set SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
      FROM PWI
      INNER JOIN SI on SI.Id = PWI.SourceItemId
      INNER JOIN SPMC on SPMC.SourceItemId = SI.Id
      AND SI.ItemSize > '+ cast(@MaxSizeMB * 1024 * 1024 as varchar(max))
      
      print (@Query)  
      

      【讨论】:

        【解决方案4】:

        @MaxSizeMB 转换为 VARCHAR 以生成动态查询:

        declare @MaxSizeMB BIGINT
        set @MaxSizeMB = 50
        
        DECLARE @Query VARCHAR(8000)='' 
        
        set @Query=            
        'Update SPMC
        Set SPMC.HasBlockedSize = 1, SPMC.HasIssues = 1
        FROM PWI
        INNER JOIN SI on SI.Id = PWI.SourceItemId
        INNER JOIN SPMC on SPMC.SourceItemId = SI.Id
        AND SI.ItemSize > '+ cast(@MaxSizeMB as varchar) +' * 1024 * 1024 '  
        
        print (@Query)   
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2012-06-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-09-07
          相关资源
          最近更新 更多