Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 ошибка в процедуре  [new]
czuc
Member

Откуда:
Сообщений: 5
добрый день, есть процедура, которая выдает ошибку:

Msg 515, Level 16, State 2, Procedure sp_LoadXMLFromFile, Line 32
Cannot insert the value NULL into column 'ItemID', table 'ADSK_DB.dbo.FileArchive'; column does not allow nulls. INSERT fails.
The statement has been terminated.


код процедуры:
USE [ADSK_DB]
GO
/****** Object:  StoredProcedure [dbo].[sp_LoadXMLFromFile]    Script Date: 07/23/2009 05:24:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_LoadXMLFromFile]
(
	@LanguageID		bigint,
	@ComponentID	bigint,
	@FileName		nvarchar(max),
	@FileContent	nvarchar(max),
	@ID				bigint output
) AS
BEGIN
	declare	@ItemID as bigint
	
	select
		@ItemID = max(ID)
	from
		dbo.Items
	where
		ComponentID = @ComponentID and
		Name = @FileName
	group by
		ID
	
	if (@ItemID = 0)
	begin
		insert into ADSK_DB.dbo.Items
			(Name, ComponentID)
		values
			(@FileName, @ComponentID)
		set @ItemID = SCOPE_IDENTITY()	
	end
	
	insert into dbo.FileArchive
			(LanguageID, ItemID, FileContent)
		values 
			(@LanguageID, @ItemID, @FileContent)
		set @ID = SCOPE_IDENTITY()
END

вызывается так:

declare @ID as bigint
exec sp_LoadXMLFromFile 1, 1, 'FileFirst', 'SomeText', @ID output
select ID = @ID

на данный момент Таблица Items пустая, но вроде же есть проверка в процедуре, почему она не проходится ??
23 июл 09, 17:19    [7452827]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
czuc


на данный момент Таблица Items пустая, но вроде же есть проверка в процедуре, почему она не проходится ??

Раз таблица пустая, то в @ItemID будет NULL, а не 0
23 июл 09, 17:21    [7452851]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
czuc
Member

Откуда:
Сообщений: 5
с NULL тоже не работает :(
23 июл 09, 17:21    [7452854]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
czuc
вроде же есть проверка в процедуре, почему она не проходится ??
Ткните пальцем в проверку, я ее не вижу!
23 июл 09, 17:22    [7452860]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
czuc
добрый день, есть процедура, которая выдает ошибку:

Msg 515, Level 16, State 2, Procedure sp_LoadXMLFromFile, Line 32
Cannot insert the value NULL into column 'ItemID', table 'ADSK_DB.dbo.FileArchive'; column does not allow nulls. INSERT fails.
The statement has been terminated.


код процедуры:
USE [ADSK_DB]
GO
/****** Object:  StoredProcedure [dbo].[sp_LoadXMLFromFile]    Script Date: 07/23/2009 05:24:10 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[sp_LoadXMLFromFile]
(
	@LanguageID		bigint,
	@ComponentID	bigint,
	@FileName		nvarchar(max),
	@FileContent	nvarchar(max),
	@ID				bigint output
) AS
BEGIN
	declare	@ItemID as bigint
	
	select
		@ItemID = max(ID)
	from
		dbo.Items
	where
		ComponentID = @ComponentID and
		Name = @FileName
	group by
		ID
	
	if (@ItemID IS NULL)
	begin
		insert into ADSK_DB.dbo.Items
			(Name, ComponentID)
		values
			(@FileName, @ComponentID)
		set @ItemID = SCOPE_IDENTITY()	
	end
	
	insert into dbo.FileArchive
			(LanguageID, ItemID, FileContent)
		values 
			(@LanguageID, @ItemID, @FileContent)
		set @ID = SCOPE_IDENTITY()
END

вызывается так:

declare @ID as bigint
exec sp_LoadXMLFromFile 1, 1, 'FileFirst', 'SomeText', @ID output
select ID = @ID

на данный момент Таблица Items пустая, но вроде же есть проверка в процедуре, почему она не проходится ??
23 июл 09, 17:22    [7452865]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
czuc
с NULL тоже не работает :(

Если вы типа поставили if (@ItemID = NULL), то разумеется тоже.
Потому что на NULL-ы проверяют по-другому
23 июл 09, 17:23    [7452867]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
	declare	@ItemID as bigint
	
SET @ItemID = 0

...

MAX() потому-что юзаете
23 июл 09, 17:23    [7452869]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
czuc
	select
		@ItemID = max(ID)
	from
		dbo.Items
	where
		ComponentID = @ComponentID and
		Name = @FileName
	group by
		ID
А в чем смысл комбинирования max(ID) с group by по тому же самому max(ID)
?

И зачем вообще этот максимум Вы ищете?
23 июл 09, 17:25    [7452886]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
czuc
Member

Откуда:
Сообщений: 5
Glory, подскажите как проверить, пожалуйста ?
23 июл 09, 17:25    [7452891]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
опечатка - group by по тому же самому ID
23 июл 09, 17:26    [7452893]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
czuc
Glory, подскажите как проверить, пожалуйста ?

Все уже подсказали.
Решение задачи вообще топорное
23 июл 09, 17:27    [7452901]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
czuc
	select
		@ItemID = max(ID)
	from
		dbo.Items
	where
		ComponentID = @ComponentID and
		Name = @FileName
	group by
		ID
А в чем смысл комбинирования max(ID) с group by по тому же самому max(ID)
?

И зачем вообще этот максимум Вы ищете?
Внимательно смотрим на результат:
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
CREATE TABLE T(X INT);
SELECT MAX(X) FROM T;
SELECT MAX(X) FROM T GROUP BY X;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
23 июл 09, 17:30    [7452933]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
iap
Внимательно смотрим на результат
нет, чтобы быть ближе к исходнику автора, дополним исходник этой самой переменной:
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
declare @ItemID int;
CREATE TABLE T(X INT);
SELECT @ItemID = MAX(X) FROM T;
select @ItemID;
SELECT @ItemID =  MAX(X) FROM T GROUP BY X;
select @ItemID;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
а вот теперь-то и посмотрим на результат
23 июл 09, 17:36    [7452983]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
czuc
Member

Откуда:
Сообщений: 5
увидел то самое "топорное" решение :)
23 июл 09, 17:40    [7453025]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
czuc
увидел то самое "топорное" решение :)
Это, конечно, хорошо, но я Вам вопрос задавал, не могли бы Вы ответить?
23 июл 09, 17:43    [7453043]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
iap
Member

Откуда: Москва
Сообщений: 46975
Паганель
iap
Внимательно смотрим на результат
нет, чтобы быть ближе к исходнику автора, дополним исходник этой самой переменной:
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
declare @ItemID int;
CREATE TABLE T(X INT);
SELECT @ItemID = MAX(X) FROM T;
select @ItemID;
SELECT @ItemID =  MAX(X) FROM T GROUP BY X;
select @ItemID;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
а вот теперь-то и посмотрим на результат
Давайте сделаем вот так:
SET NOCOUNT ON;
USE tempdb;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
declare @ItemID int;
SET @ItemID=0;
CREATE TABLE T(X INT);
SELECT @ItemID = MAX(X) FROM T GROUP BY X;
select @ItemID;
SELECT @ItemID =  MAX(X) FROM T;
select @ItemID;
IF OBJECT_ID(N'T','U') IS NOT NULL DROP TABLE T;
И только сейчас посмотрим, что же получается!
23 июл 09, 17:48    [7453079]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
где у автора инициализация переменной? не вижу...
23 июл 09, 17:49    [7453085]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Konst_One
Member

Откуда:
Сообщений: 11514
Паганель
где у автора инициализация переменной? не вижу...


в том то и дело, что нет. это я ему и написал, чтоб заработал его код.
23 июл 09, 17:51    [7453097]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Glory
Member

Откуда:
Сообщений: 104760
Паганель
czuc
увидел то самое "топорное" решение :)
Это, конечно, хорошо, но я Вам вопрос задавал, не могли бы Вы ответить?

Да просто человек таким экзотическим способом проверяет наличие записей с заданными @ComponentID и @FileName
23 июл 09, 17:51    [7453101]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Glory
Да просто человек таким экзотическим способом проверяет наличие записей с заданными @ComponentID и @FileName
Понял, спасибо
23 июл 09, 17:56    [7453140]     Ответить | Цитировать Сообщить модератору
 Re: ошибка в процедуре  [new]
czuc
Member

Откуда:
Сообщений: 5
Glory
Паганель
czuc
увидел то самое "топорное" решение :)
Это, конечно, хорошо, но я Вам вопрос задавал, не могли бы Вы ответить?

Да просто человек таким экзотическим способом проверяет наличие записей с заданными @ComponentID и @FileName


А возможно решение проще ??
23 июл 09, 22:16    [7453787]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить