为什么存储过程执行了记录添加不到表里面

FrameSniper 2008-10-24 01:38:43
create procedure udsp_InsertBusinessContractFreightQualityDetail
@BusinessContractNumber nvarchar(32),
@FreightBreedName nvarchar(16),
@ValueAddedTaxBasePrice real,
@QS real,
@GJHF real,
@NJZS real,
@JZCHD real,
@GJQL real
as
declare @Index smallint
declare @RecordAmount smallint
set @RecordAmount=(select count(*) from udot_BusinessContractFreightQualityDetail)
if (@RecordAmount=0)
begin
set @Index=1
end
else
begin
set @Index=(select max(bcfqdf_Index) from udot_BusinessContractFreightQualityDetail)+1
end
declare @BusinessContractIndex smallint
set @BusinessContractIndex=(select bcf_Index from udot_BusinessContract where bcf_BusinessContractNumber=@BusinessContractNumber)
declare @FreightBreedIndex smallint
set @FreightBreedIndex=(select fbf_Index from udsdt_FreightBreed where fbf_Name=@FreightBreedName)
declare @InsertStatement nvarchar(4000)
set @InsertStatement='insert into udot_BusinessContractFreightQualityDetail (bcfqdf_Index,
bcfqdf_BusinessContractIndex,
bcfqdf_FreightBreedIndex,
bcfqdf_ValueAddedTaxBasePrice,
bcfqdf_QS,
bcfqdf_GJHF,
bcfqdf_NJZS,
bcfqdf_JZCHD,
bcfqdf_GJQL) values ('+
convert(nvarchar(10),@Index)+','+
convert(nvarchar(10),@BusinessContractIndex)+','+
convert(nvarchar(10),@FreightBreedIndex)+','+
convert(nvarchar(10),@ValueAddedTaxBasePrice)+','+
convert(nvarchar(10),@QS)+','+
convert(nvarchar(10),@GJHF)+','+
convert(nvarchar(10),@NJZS)+','+
convert(nvarchar(10),@JZCHD)+','+
convert(nvarchar(10),@GJQL)+')'
if exists(select 1 from udot_BusinessContractFreightQualityDetail where bcfqdf_BusinessContractIndex=@BusinessContractIndex and bcfqdf_FreightBreedIndex=@FreightBreedIndex)
raiserror('已存在同名记录',16,1)
else
execute(@InsertStatement)

go

上面是我的存储过程内容

下面是调用语句

exec udsp_InsertBusinessContractFreightQualityDetail "aa","bb",0,0,0,0,0,0

为什么调用语句执行后表中没有新增记录
...全文
159 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
fcuandy 2008-10-24
  • 打赏
  • 举报
回复
忘记了是拼字串了,失败,低级错误,呵。

看来海兄是早看透了。 上半天比较忙,现在闲了。
FrameSniper 2008-10-24
  • 打赏
  • 举报
回复
问题已经解决,谢谢各位

declare @FreightBreedIndex smallint
set @FreightBreedIndex=(select fbf_Index from udsdt_FreightBreed where fbf_Name=@FreightBreedName)

这里得到的@FreightBreedIndex是NULL
所以最后在组合@InsertStatement的时候字符串和Null结合结果还是null

所以最后@InsertStatement实际等于没有执行

fcuandy 2008-10-24
  • 打赏
  • 举报
回复
看下表上有否instead触发器,另外,打开查探器再 exec 过程 参数 看看到底执行了些什么。

如果整体上只执行了 存储过程, 而没有其它东西执行,就把过程语句拉出来, 当成批语句调试。

如果除了执行存储过程,还有其它东西被执行,那么这就可能是原因。
FrameSniper 2008-10-24
  • 打赏
  • 举报
回复
没有人会了吗?

还是没有解决

ccq17 2008-10-24
  • 打赏
  • 举报
回复
declare @BusinessContractIndex smallint,值
会不会超出的
FrameSniper 2008-10-24
  • 打赏
  • 举报
回复
to fcuandy

执行存储过程后只是说命令执行完毕,没有任何的错误信息,但在表中就是没有任何记录,真是邪门了
FrameSniper 2008-10-24
  • 打赏
  • 举报
回复
to maco_wang

你的意思是这个语句不能执行吗?

insert into udot_BusinessContractFreightQualityDetail (bcfqdf_Index, bcfqdf_BusinessContractIndex, bcfqdf_FreightBreedIndex, bcfqdf_ValueAddedTaxBasePrice, bcfqdf_QS, bcfqdf_GJHF, bcfqdf_NJZS, bcfqdf_JZCHD, bcfqdf_GJQL) values (1,2,3,4,5,6,7,8,9)
fcuandy 2008-10-24
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 maco_wang 的回复:]
是不是你的空格导致你的字符串长度溢出呀?
[/Quote]


如果字串被截断,插入语句就不完整 ,执行会报错的,所以要问楼主执行存储过程后的提示信息。
fcuandy 2008-10-24
  • 打赏
  • 举报
回复
@recordamount 是 count聚合结果,所以会消除空值,不用isnull处理。

而后面两个变量@BusinessContractIndex和@FreightBreedIndex即使是取不到值 ,那么也是插入的记录相应列为null ,不存在 插不了记录的情况。

要看一下你执行存储过程,看有报什么错,或是你自定义的错误。
叶子 2008-10-24
  • 打赏
  • 举报
回复
是不是你的空格导致你的字符串长度溢出呀?
叶子 2008-10-24
  • 打赏
  • 举报
回复

declare @Index nvarchar(200)
declare @BusinessContractIndex nvarchar(200)
declare @FreightBreedIndex nvarchar(200)
declare @ValueAddedTaxBasePrice nvarchar(200)
declare @QS nvarchar(200)
declare @GJHF nvarchar(200)
declare @NJZS nvarchar(200)
declare @JZCHD nvarchar(200)
declare @GJQL nvarchar(200)

set @Index ='1'
set @BusinessContractIndex='2'
set @FreightBreedIndex ='3'
set @ValueAddedTaxBasePrice='4'
set @QS='5'
set @GJHF ='6'
set @NJZS ='7'
set @JZCHD ='8'
set @GJQL='9'
declare @InsertStatement nvarchar(2000)
set @InsertStatement='insert into udot_BusinessContractFreightQualityDetail (bcfqdf_Index,
bcfqdf_BusinessContractIndex,
bcfqdf_FreightBreedIndex,
bcfqdf_ValueAddedTaxBasePrice,
bcfqdf_QS,
bcfqdf_GJHF,
bcfqdf_NJZS,
bcfqdf_JZCHD,
bcfqdf_GJQL) values ('+
convert(nvarchar(10),@Index)+','+
convert(nvarchar(10),@BusinessContractIndex)+','+
convert(nvarchar(10),@FreightBreedIndex)+','+
convert(nvarchar(10),@ValueAddedTaxBasePrice)+','+
convert(nvarchar(10),@QS)+','+
convert(nvarchar(10),@GJHF)+','+
convert(nvarchar(10),@NJZS)+','+
convert(nvarchar(10),@JZCHD)+','+
convert(nvarchar(10),@GJQL)+')' ;

select @InsertStatement
/*
结果:

insert into udot_BusinessContractFreightQualityDetail (bcfqdf_Index, bcfqdf_BusinessContractIndex, bcfqdf_FreightBreedIndex, bcfqdf_ValueAddedTaxBasePrice, bcfqdf_QS, bcfqdf_GJHF, bcfqdf_NJZS, bcfqdf_JZCHD, bcfqdf_GJQL) values (1,2,3,4,5,6,7,8,9)
*
/

你看看你拼的这个串能单独执行吗?
FrameSniper 2008-10-24
  • 打赏
  • 举报
回复
to Yang

为什么非要加那两句

由于表结构与界面控制用户操作的原因。@BusinessContractIndex和@FreightBreedIndex是肯定可以从对应的表中取出东西的。
fcuandy 2008-10-24
  • 打赏
  • 举报
回复
过程好像没什么问题。我稍改了一下。

你在查询分析器里执行,有提不什么吗?



create procedure udsp_InsertBusinessContractFreightQualityDetail
@BusinessContractNumber nvarchar(32),
@FreightBreedName nvarchar(16),
@ValueAddedTaxBasePrice real,
@QS real,
@GJHF real,
@NJZS real,
@JZCHD real,
@GJQL real
as
declare @Index smallint

set @Index=isnull((select max(bcfqdf_Index) from udot_BusinessContractFreightQualityDetail),0) + 1

declare @BusinessContractIndex smallint
set @BusinessContractIndex=(select bcf_Index from udot_BusinessContract where bcf_BusinessContractNumber=@BusinessContractNumber)
declare @FreightBreedIndex smallint
set @FreightBreedIndex=(select fbf_Index from udsdt_FreightBreed where fbf_Name=@FreightBreedName)
declare @InsertStatement nvarchar(4000)
set @InsertStatement='insert into udot_BusinessContractFreightQualityDetail (
bcfqdf_Index,
bcfqdf_BusinessContractIndex,
bcfqdf_FreightBreedIndex,
bcfqdf_ValueAddedTaxBasePrice,
bcfqdf_QS,
bcfqdf_GJHF,
bcfqdf_NJZS,
bcfqdf_JZCHD,
bcfqdf_GJQL
) values ('+
convert(nvarchar(10),@Index)+','+
convert(nvarchar(10),@BusinessContractIndex)+','+
convert(nvarchar(10),@FreightBreedIndex)+','+
convert(nvarchar(10),@ValueAddedTaxBasePrice)+','+
convert(nvarchar(10),@QS)+','+
convert(nvarchar(10),@GJHF)+','+
convert(nvarchar(10),@NJZS)+','+
convert(nvarchar(10),@JZCHD)+','+
convert(nvarchar(10),@GJQL)+')'
if exists(select 1 from udot_BusinessContractFreightQualityDetail
where bcfqdf_BusinessContractIndex=@BusinessContractIndex and bcfqdf_FreightBreedIndex=@FreightBreedIndex
)
raiserror('已存在同名记录',16,1)
else
execute(@InsertStatement)

go
Yang_ 2008-10-24
  • 打赏
  • 举报
回复
declare @BusinessContractIndex smallint 
set @BusinessContractIndex=(select bcf_Index from udot_BusinessContract where bcf_BusinessContractNumber=@BusinessContractNumber)
declare @FreightBreedIndex smallint
set @FreightBreedIndex=(select fbf_Index from udsdt_FreightBreed where fbf_Name=@FreightBreedName)

-->

declare @BusinessContractIndex smallint
set @BusinessContractIndex=(select bcf_Index from udot_BusinessContract where bcf_BusinessContractNumber=@BusinessContractNumber)
SET @BusinessContractIndex=ISNULL(@BusinessContractIndex,0)

declare @FreightBreedIndex smallint
set @FreightBreedIndex=(select fbf_Index from udsdt_FreightBreed where fbf_Name=@FreightBreedName)
SET @FreightBreedIndex=ISNULL(@FreightBreedIndex,0)

Yang_ 2008-10-24
  • 打赏
  • 举报
回复
if (@RecordAmount=0)
-->
if (ISNULL(@RecordAmount,0)=0)

叶子 2008-10-24
  • 打赏
  • 举报
回复
就是说你测试你的存储过程不好使呗?

34,590

社区成员

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

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