Sql server 将数据类型varchar转换为bigint时出错。更新中

Sql server 将数据类型varchar转换为bigint时出错。更新中,sql-server,tsql,sql-update,dynamic-sql,Sql Server,Tsql,Sql Update,Dynamic Sql,我得到以下错误: 将数据类型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 I

我得到以下错误:

将数据类型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)   

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


由于
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(cast(@MaxSizeMB as bigint) as varchar(max)) +' * 1024 * 1024 '  

print (@Query)
试试这个:

 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)

要生成动态查询,请将
@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)   

要生成动态查询,请将
@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)   

如果不从查询中计算
@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)

如果不从查询中计算
@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)

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