-1

Here is my Table, called Tour_Lists. If my table is empty. Store Procedure work very well. But after insert first row. I continue inserting second row and get error:

Cannot insert the value NULL into column 'Ma_tour', table 'Travel.dbo.Tour_Lists'; column does not allow nulls. INSERT fails. The statement has been terminated.

What's wrong in my code?

enter image description here

Store Procedure

/****** 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
4

2 回答 2

2

这里的问题是,一旦输入了一行,那么:

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

给出@Matourcuoi一个值。这符合您的条件:

     if(@Matourcuoi is not null)

然后根据 的值计算 的@return@tangsotour。这是 null,因此会评估您的条件的以下部分(因为没有其他部分匹配):

     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 的数字部分——如果是这样,那一步就被错过了。

于 2013-07-05T14:37:49.167 回答
1

我猜你从来没有在你的桌子上设置身份种子?

于 2013-07-05T14:36:48.790 回答