sql server 2000的数据文件,还原到sql server 2005后遇到的问题

时间:2022-01-22 10:05:32
将一个sql server 2000的备份文件,还原到sql server 2005后,其它运行都很正常,只是执行一个存储过程出问题,提示是这样的  “接收变量的数据类型  decimal 不等于列 'jcshl' 的数据类型 decimal” 下面是问题的存储过程的片断

update #t_dj
set
@spkc=jcshl=case when @spid=spid then @spkc+upshl else kcshl+upshl end,
@spje=jcje=case when @spid=spid then @spje+upje else kcje+upje end,
@hwkc=hwjcsh=case when @spid=spid and @hw=hw then @hwkc+upshl else hwshl+upshl end,
@hwje=hwjcer=case when @spid=spid and @hw=hw then @hwje+upje else hwje+upje end,
        plh='Z'+right('0000000000'+ltrim(str(@m)),10),        @m=@m+1,
@spid=spid,
@hw=hw


研究了几天都没解决,大家帮帮忙吧

8 个解决方案

#1


你贴的sql没啥看的,看参数类型和表字段对应的类型。

#2


查看一下jcshl類型,查看一下變量類型@spje/字段upje--這一段的類型

#3


@spkc=jcshl=case when @spid=spid then @spkc+upshl else kcshl+upshl end
???
这是什么语法?
@spkc 是bit型?

不像吧.

#4


还真能这么搞!
create table tb(id int)
insert into tb select 1
go
declare @i int
declare @j int
declare @k int
set @j=5
set @k=3
update tb
set @i=id=case when @k=3 then 20 else 30 end
select @i,@j,@k
select * from tb
/*
                        
----------- ----------- -----------
20          5           3

(1 行受影响)

id
-----------
20

(1 行受影响)

*/
go
drop table tb

#5


declare @djlx char(3),
        @djlx1 char(1),
        @zhph char(12),
        @cor_ysh dec(20,2),
        @cor_yf dec(20,2),
        @tmp_jcsl dec(14,2)
  set @djlx=left(@djbh,3)
  set @djlx1=left(@djbh,1)
  set @zhph=''
  set @cor_ysh=0
  set @cor_yf=0
  set @tmp_jcsl=0
 

declare 
@spid char(11),
@hw char(11),
@spkc decimal,
@spje decimal,
@hwkc decimal,
@hwje decimal,
        @maxbh char(11),
        @jzhh char(11)

set @spid='***'
set @hw='***'

这是存储过程声明变量的部分,这个存储过程,在SQL server2000下面运行的很正常,但到了2005就不行了

#6


要求变量和列的数据类型定义成同样的数据类型.
create table tb(id decimal(8,2))--这儿的定义
insert into tb select 1
go
declare @i decimal(8,3)  --和这儿的定义不一样
declare @k int
set @k=3
update tb
set @i=id=case when @k=3 then 20.1 else 30.5 end
/*
消息 425,级别 16,状态 1,第 4 行
接收变量的数据类型 decimal 不等于列 'id' 的数据类型 decimal。

*/
go
drop table tb

#7


数据库当前的兼容等级是什么?

分别修改一下数据库的兼容等级为80或90试试.

#8


declare @spkc decimal     --要将此处的 decimal 精度定义与表中 jcshl 的精度定义设置为相同
create table tb(jcshl decimal(8,2))
insert into tb select 12.98
update tb set @spkc=jcshl=12.98
/*
消息 425,级别 16,状态 1,第 4 行
接收变量的数据类型 decimal 不等于列 'jcshl' 的数据类型 decimal。

*/
go
drop table tb
go
declare @spkc decimal(8,2)     --这样就不会出错了
create table tb(jcshl decimal(8,2))
insert into tb select 12.98
update tb set @spkc=jcshl=12.98

go
drop table tb

#1


你贴的sql没啥看的,看参数类型和表字段对应的类型。

#2


查看一下jcshl類型,查看一下變量類型@spje/字段upje--這一段的類型

#3


@spkc=jcshl=case when @spid=spid then @spkc+upshl else kcshl+upshl end
???
这是什么语法?
@spkc 是bit型?

不像吧.

#4


还真能这么搞!
create table tb(id int)
insert into tb select 1
go
declare @i int
declare @j int
declare @k int
set @j=5
set @k=3
update tb
set @i=id=case when @k=3 then 20 else 30 end
select @i,@j,@k
select * from tb
/*
                        
----------- ----------- -----------
20          5           3

(1 行受影响)

id
-----------
20

(1 行受影响)

*/
go
drop table tb

#5


declare @djlx char(3),
        @djlx1 char(1),
        @zhph char(12),
        @cor_ysh dec(20,2),
        @cor_yf dec(20,2),
        @tmp_jcsl dec(14,2)
  set @djlx=left(@djbh,3)
  set @djlx1=left(@djbh,1)
  set @zhph=''
  set @cor_ysh=0
  set @cor_yf=0
  set @tmp_jcsl=0
 

declare 
@spid char(11),
@hw char(11),
@spkc decimal,
@spje decimal,
@hwkc decimal,
@hwje decimal,
        @maxbh char(11),
        @jzhh char(11)

set @spid='***'
set @hw='***'

这是存储过程声明变量的部分,这个存储过程,在SQL server2000下面运行的很正常,但到了2005就不行了

#6


要求变量和列的数据类型定义成同样的数据类型.
create table tb(id decimal(8,2))--这儿的定义
insert into tb select 1
go
declare @i decimal(8,3)  --和这儿的定义不一样
declare @k int
set @k=3
update tb
set @i=id=case when @k=3 then 20.1 else 30.5 end
/*
消息 425,级别 16,状态 1,第 4 行
接收变量的数据类型 decimal 不等于列 'id' 的数据类型 decimal。

*/
go
drop table tb

#7


数据库当前的兼容等级是什么?

分别修改一下数据库的兼容等级为80或90试试.

#8


declare @spkc decimal     --要将此处的 decimal 精度定义与表中 jcshl 的精度定义设置为相同
create table tb(jcshl decimal(8,2))
insert into tb select 12.98
update tb set @spkc=jcshl=12.98
/*
消息 425,级别 16,状态 1,第 4 行
接收变量的数据类型 decimal 不等于列 'jcshl' 的数据类型 decimal。

*/
go
drop table tb
go
declare @spkc decimal(8,2)     --这样就不会出错了
create table tb(jcshl decimal(8,2))
insert into tb select 12.98
update tb set @spkc=jcshl=12.98

go
drop table tb