数据库 存储过程 从数据类型 nvarchar 转换为 smallint 时出错。

canhui2009 2012-04-27 10:17:33
消息 8114,级别 16,状态 5,过程 add_patientinfo,第 0 行
从数据类型 nvarchar 转换为 smallint 时出错。
(1 行受影响)

存储过程如下:
USE [MyHostpitalno]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[add_patientinfo]
@mediccareid = N'12',
@inhospital = N'21',
@sickbedid = N'12',
@endscpid = 21,
@endscpcode = 2,
@instrumentid = N'12',
@patientname = N'dsfa',
@sex = N'1',
@birthday = N'1990-11-12',
@age = 21,
@phone = N'123',
@address = N'dsagfsdgasg',
@worksite = N'dsafsd',
@askhospt = 12,
@askdept = 12,
@askdr = 12,
@asktime = N'1990-11-12',
@checkdr = N'dsfa'

SELECT 'Return Value' = @return_value
GO

存储过程用到的表:
PATIENTID int Unchecked
MEDICCAREID varchar(20) Checked
INHOSPITAL varchar(20) Checked
SICKBEDID varchar(10) Checked
ENDSCPID int Unchecked
ENDSCPCODE smallint Unchecked
INSTRUMENTID tinyint Unchecked
PATIENTNAME varchar(10) Unchecked
SEX char(1) Unchecked
BIRTHDAY datetime Checked
AGE smallint Unchecked
PHONE varchar(30) Unchecked
ADDRESS varchar(40) Checked
WORKSITE varchar(40) Checked
ASKHOSPT smallint Checked
ASKDEPT smallint Checked
ASKDR smallint Checked
ASKTIME datetime Checked
CHECKDR smallint Checked
CHECKDEPT smallint Checked
CHECKTIME datetime Checked
...全文
769 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
canhui2009 2012-05-28
  • 打赏
  • 举报
回复
谢谢大家,特别是pt1314917大牛,我重新做了下,没啥大问题了,刚刚接触数据库的存储过程,很菜的,大牛推荐本好些的数据库教程或者其他资源吧,感觉自己这样学着很吃力啊。
pt1314917 2012-05-05
  • 打赏
  • 举报
回复
简单对了下,你在调用存储过程时就有很明显的错误,参数@checkdr明明是smallint类型的,你传的值是@checkdr = N'dsfa'字符串。当然会报错了。不排除其他地方还有这样的错误。楼主细心点吧。
pt1314917 2012-05-05
  • 打赏
  • 举报
回复
晕。就一个简单的增加和修改语句。。。
这个别人还真没法给你一个一个对应的找。
楼主稍微细心点,自己好好对应的看下,给字段赋值的过程中。有没有把字符串的值赋给数字类型的字段。。
主要看那些数字类型的字段。。。
canhui2009 2012-05-05
  • 打赏
  • 举报
回复
不好意思存储过程贴错地方了。[Quote=引用 8 楼 的回复:]

存储过程add_patientinfo内找问题。贴存储过程。。。
[/Quote]
canhui2009 2012-05-05
  • 打赏
  • 举报
回复
存储过程非常多的,我贴上来吧。
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
go

ALTER PROCEDURE [dbo].[add_patientinfo]
(
@mediccareid [varchar](20),
@inhospital [varchar](20),
@sickbedid [varchar](10),
@endscpid [varchar](9),
@endscpcode [smallint],

@instrumentid [varchar](2),
@patientname [varchar](10),
@sex [char](1),
@birthday [datetime],
@age [varchar](4),

@phone [varchar](30),
@address [varchar](40),
@worksite [varchar](40),
@askhospt [smallint],
@askdept [smallint],

@askdr [smallint],
@asktime [datetime],
@checkdr [smallint],
@checkdept [smallint],
@checktime [datetime],

@reportdr [smallint],
@reportdept [smallint],
@reporttime [datetime],
@imagecount [smallint],
@videocount [smallint],

@checkstatus [tinyint],
@checkdesc [varchar](3000),
@diagnosedesc [varchar](2000),
@recordcdno [varchar](20),
@sampcount [tinyint],

@casenotedesc [varchar](2000),
@cdstatus [tinyint],
@checkdiagnose [varchar](20),
@jcxm [varchar](100)
)
AS
DECLARE @PatientCount as int
SELECT @PatientCount =Count(*) FROM Patient
WHERE
[INSTRUMENTID]= CONVERT(tinyint,@instrumentid)
AND
[ENDSCPID]=CONVERT(int,@endscpid)

if @PatientCount=0
Begin
INSERT INTO [Patient]
(
MEDICCAREID,
INHOSPITAL,
SICKBEDID,
ENDSCPID,
ENDSCPCODE,

INSTRUMENTID,
PATIENTNAME,
SEX,
BIRTHDAY,
AGE,

PHONE,
ADDRESS,
WORKSITE,
ASKHOSPT,
ASKDEPT,

ASKDR,
ASKTIME,
CHECKDR,
CHECKDEPT,
CHECKTIME,

REPORTDR,
REPORTDEPT,
REPORTTIME,
IMAGECOUNT,
VIDEOCOUNT,

CHECKSTATUS,
CHECKDESC,
DIAGNOSEDESC,
RECORDCDNO,
SAMPCOUNT,

CASENOTEDESC,
CDSTATUS,
CHECKDIAGNOSE,
JCXM
)
VALUES
(
@mediccareid,
@inhospital,
@sickbedid,
CONVERT(int,@endscpid),
@endscpcode,

CONVERT(tinyint,@instrumentid),
@patientname,
@sex,
@birthday,
CONVERT(smallint,@age),

@phone,
@address,
@worksite,
@askhospt,
@askdept,

@askdr,
@asktime,
@checkdr,
@checkdept,
@checktime,

@reportdr,
@reportdept,
@reporttime,
@imagecount,
@videocount,

@checkstatus,
@checkdesc,
@diagnosedesc,
@recordcdno,
@sampcount,

@casenotedesc,
@cdstatus,
@checkdiagnose,
@jcxm
)
end
ELSE
BEGIN
UPDATE [Patient]
SET
[MEDICCAREID]= @mediccareid,
[INHOSPITAL]=@inhospital,
[SICKBEDID]=@sickbedid,
[ENDSCPID]=CONVERT(int,@endscpid),
[ENDSCPCODE]=@endscpcode,

[INSTRUMENTID]= CONVERT(tinyint,@instrumentid),
[PATIENTNAME]=@patientname,
[SEX]=@sex,
[BIRTHDAY]= @birthday,
[AGE]=CONVERT(smallint,@age),

[PHONE]=@phone,
[ADDRESS]=@address,
[WORKSITE]=@worksite,
[ASKHOSPT]=@askhospt,
[ASKDEPT]=@askdept,

[ASKDR]= @askdr,
[ASKTIME]=@asktime,
[CHECKDR]=@checkdr,
[CHECKDEPT]=@checkdept,
[CHECKTIME]=@checktime,

[REPORTDR]=@reportdr,
[REPORTDEPT]=@reportdept,
[REPORTTIME]=@reporttime,
[IMAGECOUNT]= @imagecount,
[VIDEOCOUNT]=@videocount,

[CHECKSTATUS]=@checkstatus,
[CHECKDESC]= @checkdesc,
[DIAGNOSEDESC]= @diagnosedesc,
[RECORDCDNO]=@recordcdno,
[SAMPCOUNT]=@sampcount,

[CASENOTEDESC]= @casenotedesc,
[CDSTATUS]= @cdstatus,
[CHECKDIAGNOSE]=@checkdiagnose,
[JCXM]=@jcxm
WHERE
[INSTRUMENTID]= CONVERT(tinyint,@instrumentid)
AND
[ENDSCPID]=CONVERT(int,@endscpid)
END

[Quote=引用 7 楼 的回复:]

@sickbedid = N'12',像这些加了N的会自动转换成NVARCHAR/NCHAR的。你的代码还是要严谨一点地检查。估计不是你自己写的。
[/Quote]
canhui2009 2012-05-05
  • 打赏
  • 举报
回复
存储过程的代码确实不是我写的,是我执行存储过程时给参数赋值时自动生成的,而且提示这个错误。[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

可是我的表中没有用到nvarchar 类型?引用 4 楼 的回复:

错误很明显了。

数据类型 nvarchar 转换为 smallint 时出错。

写入的地方,数据类型没匹配好。 LZ检查一下即可。


不是你的表中有NVARCHAR类型的,是你调用存储过程时输入的值是NVARCHAR类型的,到过程里面插入表时转化为smallint时出错……
[/Quote]
pt1314917 2012-05-04
  • 打赏
  • 举报
回复
存储过程add_patientinfo内找问题。贴存储过程。。。
發糞塗牆 2012-05-04
  • 打赏
  • 举报
回复
@sickbedid = N'12',像这些加了N的会自动转换成NVARCHAR/NCHAR的。你的代码还是要严谨一点地检查。估计不是你自己写的。
孤独加百列 2012-05-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

可是我的表中没有用到nvarchar 类型?引用 4 楼 的回复:

错误很明显了。

数据类型 nvarchar 转换为 smallint 时出错。

写入的地方,数据类型没匹配好。 LZ检查一下即可。
[/Quote]

不是你的表中有NVARCHAR类型的,是你调用存储过程时输入的值是NVARCHAR类型的,到过程里面插入表时转化为smallint时出错了。主要检查一下给你表里smallint字段赋值时有没有字符串的。
比如你表里面CHECKDR smallint是smallint类型的,传的值@checkdr就是NVARCHAR的
canhui2009 2012-05-04
  • 打赏
  • 举报
回复
可是我的表中没有用到nvarchar 类型?[Quote=引用 4 楼 的回复:]

错误很明显了。

数据类型 nvarchar 转换为 smallint 时出错。

写入的地方,数据类型没匹配好。 LZ检查一下即可。
[/Quote]
anzhiqiang_touzi 2012-04-28
  • 打赏
  • 举报
回复
给你办法
一边删除一边测试
或者


return
Mr_Nice 2012-04-28
  • 打赏
  • 举报
回复
错误很明显了。

数据类型 nvarchar 转换为 smallint 时出错。

写入的地方,数据类型没匹配好。 LZ检查一下即可。
  • 打赏
  • 举报
回复
太多了。

你自己把每个字段的类型看一下,然后看看被赋的值能不能转换成对应的类型。比如说含有特殊字符的字符串就不能转换成数字类型
canhui2009 2012-04-27
  • 打赏
  • 举报
回复
不知道怎么弄,看着应该没错的,请大牛给俺解决下,谢谢了

34,590

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧