2013-07-05 92 views
-1

这是我的表,名为Tour_Lists。如果我的桌子是空的。存储过程非常好。但插入第一行后。我继续插入第二行并出现错误:无法使用存储过程将值NULL插入列(MS-SQL)

无法将值NULL插入到列'Ma_tour',表'Travel.dbo.Tour_Lists'中;列不允许有空值。 INSERT失败。该语句已终止。

我的代码出了什么问题?

enter image description here

存储过程

/****** Object: StoredProcedure [dbo].[ThemTour] Script Date: 07/05/2013 21:16:14 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER PROCEDURE [dbo].[ThemTour] 
@ten_tour nvarchar(100), 
@lich_trinh nvarchar(MAX), 
@gia decimal(18,0), 
@thoi_gian nvarchar(50), 
@khoi_hanh nvarchar(50), 
@noi_khoi_hanh nvarchar(100), 
@phuong_tien nvarchar(50), 
@khach_san nvarchar(30), 
@diem_den nvarchar(100), 
@anh_dai_dien image, 
@trang_thai bit = 1 
AS 
BEGIN 
declare @return nvarchar(100), 
@Matourcuoi nvarchar(100), 
@sothutu nvarchar(50), 
@dodaichuoi int, 
@tangsotour int 
select top(1) @Matourcuoi = Ma_tour from Tour_Lists order by Ma_tour desc -- lấy cái MaTour cuối cùng trong bảng 
if(@Matourcuoi is not null) 
begin 
-- Analyzing... 
select @dodaichuoi = len(@Matourcuoi) -- cho biết độ dài của chuổi 
select @sothutu = substring(@Matourcuoi,3,@dodaichuoi - 2) -- Trả về con số trong chuối, bắt đầu lấy từ ký tự thứ 3 cho đên hêt chuổi (trừ 2 chữ 'NV' ra) 
select @tangsotour = convert(int,@tangsotour) + 1 -- cho nó tăng thêm 1 đơn vị, chuẩn bị chèn vô 

-- cấu trúc switch-case-default bên SQL là thế này 
select @return = case 
when len(convert(nvarchar,@tangsotour))=1 then 'Tour000'+convert(nvarchar,@tangsotour) --nếu là số có 1 chữ số 
when len(convert(nvarchar,@tangsotour))=2 then 'Tour00'+convert(nvarchar,@tangsotour) -- nếu là 2 chữ số 
when len(convert(nvarchar,@tangsotour))=3 then 'Tour0'+convert(nvarchar,@tangsotour) -- nếu là 3 chữ số 
when len(convert(nvarchar,@tangsotour))=4 then 'Tour'+convert(nvarchar,@tangsotour) --nếu là 4 chữ số 
else 'Tour'+convert(nvarchar,@tangsotour) -- nếu trên 4 chữ số: từ 10,000 trở đi 
end -- end of switch-case-default 

end -- endif 
else select @return='Tour0001' -- nếu chưa có mẩu tin nào trong bảng Tour_Lists 
insert into Tour_Lists (Ma_tour,Ten_tour,Lich_trinh,Gia,Thoi_gian,Khoi_hanh,Noi_khoi_hanh,Phuong_tien,Khach_san,Diem_den,Anh_dai_dien,Trang_thai) 
VALUES (@return,@ten_tour,@lich_trinh,@gia,@thoi_gian,@khoi_hanh,@noi_khoi_hanh,@phuong_tien,@khach_san,@diem_den,@anh_dai_dien,@trang_thai) 
END 
+0

正如标题所说,你问'为什么你不能不将值NULL插入列'Ma_tour',表'Travel.dbo.Tour_Lists'' 原因是NULL不允许 – surfmuggle

+0

您可能想要重新形成你的问题。据我可以告诉你想知道为什么参数@返回为NULL – surfmuggle

+0

检查您的代码的这一行:'select @tangsotour = convert(int,@ tangsotour)+ 1'。看起来像一个错误在这里 –

回答

2

这里的问题是,一旦某行已经被输入,则:

select top(1) @Matourcuoi = Ma_tour from Tour_Lists order by Ma_tour desc 

@Matourcuoi的值。然后,这符合您的条件:

 if(@Matourcuoi is not null) 

其中接着计算@return基础上,@tangsotour值的值。这是零,以使条件的以下部分中进行评估(如无其他部分匹配):

 else 'Tour'+convert(nvarchar,@tangsotour) 

添加一个varchar为NULL产生一个NULL,所以由时间达到:

insert into Tour_Lists (Ma_tour,Ten_tour,Lich_trinh,Gia,Thoi_gian,Khoi_hanh,Noi_khoi_hanh,Phuong_tien,Khach_san,Diem_den,Anh_dai_dien,Trang_thai) 
    VALUES (@return,@ten_tour,@lich_trinh,@gia,@thoi_gian,@khoi_hanh,@noi_khoi_hanh,@phuong_tien,@khach_san,@diem_den,@anh_dai_dien,@trang_thai) 

@return仍然是NULL,因此你的错误。

因为我不熟悉示例代码中使用的语言,所以我无法确定变量是什么意思,所以不能提供简单的解决方法。我猜测,尽管@tangsotour是为@Matourcui加上1的数字部分 - 如果是的话,那一步已被错过。

+0

所以这条线我需要是正确的 –

+0

没有一个具体的'不正确'的行,只有一步失踪,为你'@ tangsotour'找出一个值。 –

+0

@ user2494232 - 我认为这条线的逻辑出错了:'select @tangsotour = convert(int,@ tangsotour)+ 1'你在两边都有相同的变量。 –

1

我猜,你从来没有设置你的表中标识种子?

+0

我的主键是varchar。我如何设置身份? –

相关问题