【问题标题】:error while inserting data using dynamic insert datatype varchar cannot convert to int使用动态插入数据类型 varchar 插入数据时出错,无法转换为 int
【发布时间】:2014-02-02 10:55:13
【问题描述】:

我有以下查询,用于动态插入数据到表中,我检查了表的数据类型和我传递的参数是否相同,但仍然出现以下错误:


4 1 消息 245,第 16 级,状态 1,第 43 行 将 varchar 值 'insert 转换为 tblAccessRights (RoleId,CustomerId,IsCustomerExclusive,SubcustomerId,
IsSubCustomerExclusive,ClinicId,CreatedBy,CreatedDate,IsDeleted,IsActive)
values(' 到数据类型 int.


这是我的查询请检查

declare @SubcustomerId varchar(max)    
set @SubcustomerId = '4,5'  

declare @IsSubCustomerExclusive varchar(max)
set @IsSubCustomerExclusive = '1,0'
declare  
@RoleId int ,    
@CustomerId int,    
@IsCustomerExclusive int,    

@ClinicId varchar(max)=null,    
@CreatedBy int,    
@CreatedDate datetime,    
@ModifiedBy int,    
@ModifiedDate datetime,    
@IsDeleted bit,    
@IsActive bit,    
@RoleName varchar(50) 
set  
@RoleId =24     
set @IsCustomerExclusive =0    

set @ClinicId =null  
set @CreatedBy=null  
set @CreatedDate =null   
set @ModifiedDate =null    
set @IsDeleted=0    
set @IsActive =1    
set @RoleName='ts1'   


declare @sql varchar(max)    

while(len(@SubcustomerId) > 0 and LEN(@IsSubCustomerExclusive)>=0)  
begin    
  print left(@SubcustomerId, charindex(',', @SubcustomerId+',')-1)  
  print left(@IsSubCustomerExclusive, charindex(',', @IsSubCustomerExclusive+',')-1) 
 if(LEN(@IsSubCustomerExclusive)=0 )  
 begin  
   set @IsSubCustomerExclusive='0'  
 end  

   set @sql='insert into tblAccessRights        (RoleId,CustomerId,IsCustomerExclusive,SubcustomerId,    
IsSubCustomerExclusive,ClinicId,CreatedBy,CreatedDate,IsDeleted,IsActive)    
values('+@RoleId+','+@CustomerId+','+@IsCustomerExclusive+','+left(@SubcustomerId,   charindex(',', @SubcustomerId+',')-1)+',    
  '+left(@IsSubCustomerExclusive, charindex(',',  @IsSubCustomerExclusive+',')-1)+','+@ClinicId+','+@CreatedBy+','+@CreatedDate+','+@IsDeleted      +','+@IsActive+')'
print @sql    

   --exec(@sql)    
     set @SubcustomerId = stuff(@SubcustomerId, 1, charindex(',', @SubcustomerId+','), '')   
       set @IsSubCustomerExclusive = stuff(@IsSubCustomerExclusive, 1, charindex(',',  @IsSubCustomerExclusive+','), '')     
        end  

我在查询中做错了吗???,请帮助

pid int 
RoleId  int 
CustomerId  int 
IsCustomerExclusive int 
SubcustomerId   varchar(MAX)    
IsSubCustomerExclusive  varchar(MAX)    
ClinicId    varchar(MAX)    
CreatedBy   varchar(50) 
CreatedDate datetime    
ModifiedBy  varchar(50) 
ModifiedDate    datetime    
IsDeleted   bit 
IsActive    bit

这是我的表结构

【问题讨论】:

  • 您可以将您的 SQL 字符串作为参数传递,其中需要一个 int。
  • 是mysql还是SQL server?您添加了两个标签。我猜是 SQL 服务器
  • @Pleun:它是sql server 2008

标签: sql-server sql-server-2008-r2 dynamicquery


【解决方案1】:

示例:

   SELECT field,CONVERT(SUBSTRING_INDEX(field,'-',-1),UNSIGNED INTEGER) AS num
    FROM table
    ORDER BY num;


convert text into number in mysql query

【讨论】:

    【解决方案2】:

    你的 RoleID 是一个整数,所以你尝试做一个隐式转换:'insert into table ......' as int

    你应该尝试做类似 'foo' + CONVERT(varchar,@RoleId) + ' ba' 比你得到的:'foo 24 ba'

    http://technet.microsoft.com/en-us/library/aa226054%28v=sql.80%29.aspx

    设置@sql='insert into tblAccessRights (RoleId,CustomerId,IsCustomerExclusive,SubcustomerId,
    IsSubCustomerExclusive,ClinicId,CreatedBy,CreatedDate,IsDeleted,IsActive)
    values(' + CONVERT(varchar, @RoleId) + ',' + CONVERT(varchar, @CustomerId) + ...

    【讨论】:

    • 您将 @RoleID 声明为 int。如果您尝试将 int 与 varchar 连接,dbms 会尝试将 varchar 转换为 int,但您想以另一种方式转换:int as varchar。
    • 看看引用:technet.microsoft.com/en-us/library/aa276862%28v=sql.80%29.aspx 它说:返回具有最高优先级的参数的数据类型。有关详细信息,请参阅数据类型优先级。
    猜你喜欢
    • 1970-01-01
    • 2023-04-07
    • 2011-03-29
    • 1970-01-01
    • 2021-10-02
    • 2021-07-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多