ALTER proc [dbo].[UpdateMeter]
@MeterNo char(20),
@MeterName varchar(50),
@MeterAlias char(16),
@MeterType char(4),
@collect  int,
@Unit char(14),
@MaxQty bigint,
@BaseQty bigint,
@DAFrequence bigint,
@DAStartTime datetime,
@magnifyingPower varchar(50),
@meterCategory varchar(20),
@meterUseType varchar(20),
@useDepartment varchar(50),
@buildingNo varchar(30),
@usePlace varchar(30),
@MAXIncQty  intas
declare @sql nvarchar(800)
set @sql='update Meter set MeterNo='''+@MeterNo+''',
   MeterName='''+@MeterName+''',
   MeterAlias='''+@MeterAlias+''',
   MeterType='''+@MeterType+''',
   Unit='''+@Unit+''',
   MaxQty='+convert(nvarchar(20),@MaxQty)+',
   BaseQty='+convert(nvarchar(20),@BaseQty)+',
   DAFrequence='+convert(nvarchar(20),@DAFrequence)+',
   DAStartTime='''+convert(nvarchar(25),@DAStartTime)+''',
   magnifyingPower='''+@magnifyingPower+''',
   meterCategory='''+@meterCategory+''',
   meterUseType='''+@meterUseType+''',
   useDepartment='''+@useDepartment+''',
   buildingNo='''+@buildingNo+''',
   usePlace='''+@usePlace+''',
   MAXIncQty='''+@MAXIncQty+'''  where MeterNo='''+@MeterNo+''''
exec (@sql)
问题一:这样“拼接SQL”的时候什么时候用“单引号”,什么时候用“双引号”,什么时候用“单引号+双引号”???问题二:出现报错,信息如下。
    在将 nvarchar 值 'update Meter set MeterNo='CS001               ',
   MeterName='CS',
   MeterAlias='                ',
   MeterType='EM  ',
   Unit='kWh           ',
   MaxQty=9999999,
   BaseQty=0,
   DAFrequence=15,
   DAStartTime='05 23 2012 10:17AM',
   magnifyingPower='',
   meterCategory='Summary   ',
   meterUseType='C         ',
   useDepartment='',
   buildingNo='310000Fa001',
   usePlace='',
   MAXIncQty='' 转换成数据类型 int 时失败。为什么报错,应该怎样修改???

解决方案 »

  1.   

    MAXIncQty 是int 类型 你用cast 或convert转换一下就可以了。
      

  2.   

    MAXIncQty int 类型怎么能这样赋值  MAXIncQty=''
    MAXIncQty=NULL 这样就不会报错了。
      

  3.   


    传进来的“@MAXIncQty”的参数本来就是“Int”类型的啊,为什么还要转化呢???
      

  4.   

    你的sql 是字符串类型的,而你在拼接的时候加了一个int型的变量,所以说要把int转化为字符串类型的
    这样字符串=字符串+字符串了
    没有双引号,只有单引号,字符串中2个单引号转义为一个单引号
      

  5.   

    set @sql='update Meter set MeterNo='''+@MeterNo+''',
    MeterName='''+@MeterName+''',
    MeterAlias='''+@MeterAlias+''',
    MeterType='''+@MeterType+''',
    Unit='''+@Unit+''',
    MaxQty='+convert(nvarchar(20),@MaxQty)+',
    BaseQty='+convert(nvarchar(20),@BaseQty)+',
    DAFrequence='+convert(nvarchar(20),@DAFrequence)+',
    DAStartTime='''+convert(nvarchar(25),@DAStartTime)+''',
    magnifyingPower='''+@magnifyingPower+''',
    meterCategory='''+@meterCategory+''',
    meterUseType='''+@meterUseType+''',
    useDepartment='''+@useDepartment+''',
    buildingNo='''+@buildingNo+''',
    usePlace='''+@usePlace+''',
    MAXIncQty='+convert(nvarchar(20),@MAXIncQty)+''
      

  6.   

    动态SQL先PRINT出来,看看PRINT出来的东西哪错了再改改
      

  7.   


    如果是把整形拼接到字符串后面,建议还是CONVERT成字符串类型,毕竟SQL不会帮你转换的,否则就会报错。
      

  8.   

    谢谢大家。
    问题一:
    MeterName='''+@MeterName+''' ,这样是给变量“@MeterName”的值,加了一个引号对吧???这样说明它是字符串类型的,是么???

    问题二:
    MAXIncQty='+convert(nvarchar(20),@MAXIncQty)+''这样对“@MAXIncQty”进行了转化,转化为“字符串”进行拼接。如果直接给“@MAXIncQty”,如上加两个“'”,也不行为什么么???

    问题三:
    这样拼接是不是比较消耗资源???

      

  9.   

    动态SQL打印出来,然后看少什么?再加,一般是单引号的,要再加一次单引号
      

  10.   

    一般来收,数值型的变量,必须用convert或者cast函数转换成varchar等字符型,不需要什么单引号。比如你代码里的:
    MaxQty='+convert(nvarchar(20),@MaxQty)+',这里用单引号是为了引用中间的变量的。如果后面没其他的内容,那么就是:
    MaxQty='+convert(nvarchar(20),@MaxQty)日期型的,最好使用convert函数,配合日期型不同的显示类型来转换成字符型,这时候需要将转换后的值用单引号,比如:
    DAStartTime='''+convert(nvarchar(25),@DAStartTime)+''',前面一组3个单引号,第1个是转义符,真正显示出来的是第2个,第3个单引号和后面一组3个单引号的第1个用来引用变来那个的,后面一组第2个单引号也是转义符,真正显示出来是第3个单引号。
      

  11.   

    当出现类似于在“将nvarchar 值 转换成数据类型 int 时失败”这样的错误时,我一般的做法是将原来的整型变量改为字符类型的就好了,或者是将其转换为字符类型的,转换的方法还是挺多的!