2013-07-05 136 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。我如何設置身份? –

相關問題