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

Откуда: Москва
Сообщений: 2247
получаю ошибки на инсерте
Не удалось вставить значение NULL в столбец "ID_Source", таблицы "DataExchange.dbo.KeyValues"; в столбце запрещены значения NULL. Ошибка в INSERT.


не понимаю в чем дело, отдельно код (вне этой ХП) вроде выполняется, а внутри не хочет, такое ощущение, что переменная @IDSource внутри зануляется

ХП
+
ALTER PROCEDURE [dbo].[Export_Object] 
	@IDSession char(200),  -- Сеансовый ключ
	@KeyHost char(200),    -- Имя узла получателя
	@KeyObject char(200),  -- Идентификатор объекта
	@TypeObject char(200), -- Идентификатор типа объекта
	@CRC char(200),        -- CRC обьекта
	@Date date,            -- дата 
	@Count numeric(18,2),  -- количество 
	@Sum numeric(18,2),    -- сумма 
	@Currency char(3),     -- валюта 
	@comment char(200),    -- текстовое описание
	@Value_1 char(200),    -- текстовое поле 1.
	@Value_2 char(200),    -- текстовое поле 2.
	@Value_3 char(200),    -- текстовое поле 3.
	@Value_4 char(200),    -- текстовое поле 4.
	@Value_5 char(200),    -- текстовое поле 5.
	@Value_6 char(200),    -- текстовое поле 6.
	@Value_7 char(200),    -- текстовое поле 7.
	@Value_8 char(200),    -- текстовое поле 8.
	@Value_9 char(200),    -- текстовое поле 9.
	@Value_Key_1 char(200),-- идентификатор объекта 1
	@Value_Key_2 char(200),-- идентификатор объекта 2
	@Value_Key_3 char(200),-- идентификатор объекта 3
	@Value_Key_4 char(200),-- идентификатор объекта 4
	@Value_Key_5 char(200),-- идентификатор объекта 5
	@Value_Key_6 char(200),-- идентификатор объекта 6
	@Value_Key_7 char(200),-- идентификатор объекта 7
	@Value_Key_8 char(200),-- идентификатор объекта 8
	@Value_Key_9 char(200) -- идентификатор объекта 9
AS
BEGIN
	DECLARE	@IDSource int
	SELECT @IDSource = ID_Source FROM CurrentSession WHERE (CurrentSession.IDSesion = @IDSession AND CurrentSession.MSid = @@SPID)
	IF @IDSource IS NULL RAISERROR ('ERROR ID SESSION', 18, 1);


-- проверку прошли, получим ID для базы получателя, типа объекта и самого объекта
	DECLARE	@IDDestination int
	DECLARE	@IDType int
	DECLARE	@IDObject int
	SELECT @IDDestination = ID FROM Sources WHERE (Sources.KeySource = @KeyHost);
	SELECT @IDType = ID FROM RecordType WHERE (RecordType.Name = @TypeObject);
	SELECT @IDObject = ID FROM KeyValues WHERE (KeyValues.KeySource = @KeyObject AND KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType);
    IF (@IDObject IS NULL)  
      BEGIN
        INSERT INTO KeyValues (KeySource, ID_Source, ID_Destination, ID_Type) VALUES (@KeyObject, @IDSource, @IDDestination, @IDType)
    	SELECT @IDObject = ID FROM KeyValues WHERE (KeyValues.KeySource = @KeyObject AND KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType)
      END


-- пройдем все ссылочные параметры

    DECLARE	@ID_Value_Key_1 int
    DECLARE	@ID_Value_Key_2 int
    DECLARE	@ID_Value_Key_3 int
    DECLARE	@ID_Value_Key_4 int
    DECLARE	@ID_Value_Key_5 int
    DECLARE	@ID_Value_Key_6 int
    DECLARE	@ID_Value_Key_7 int
    DECLARE	@ID_Value_Key_8 int
    DECLARE	@ID_Value_Key_9 int

    IF (@Value_Key_1 IS NOT NULL) AND (LEN(@Value_Key_1) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_1)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_1)

    IF (@Value_Key_2 IS NOT NULL) AND (LEN(@Value_Key_2) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_2)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_2)

    IF (@Value_Key_3 IS NOT NULL) AND (LEN(@Value_Key_3) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_3)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_3)

    IF (@Value_Key_4 IS NOT NULL) AND (LEN(@Value_Key_4) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_4)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_4)

    IF (@Value_Key_5 IS NOT NULL) AND (LEN(@Value_Key_5) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_5)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_5)

    IF (@Value_Key_6 IS NOT NULL) AND (LEN(@Value_Key_6) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_6)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_6)

    IF (@Value_Key_7 IS NOT NULL) AND (LEN(@Value_Key_7) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_7)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_7)

    IF (@Value_Key_8 IS NOT NULL) AND (LEN(@Value_Key_8) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_8)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_8)

    IF (@Value_Key_9 IS NOT NULL) AND (LEN(@Value_Key_9) > 0) AND NOT EXISTS (SELECT ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_9)) 
      INSERT INTO KeyValues (ID_Source, ID_Destination, ID_Type, KeySource) VALUES (@IDSource, @IDDestination, @IDType, @Value_Key_9)

-- получим ID  ссылочных параметров 
	SELECT @ID_Value_Key_1 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_1)
	SELECT @ID_Value_Key_2 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_2)
	SELECT @ID_Value_Key_3 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_3)
	SELECT @ID_Value_Key_4 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_4)
	SELECT @ID_Value_Key_5 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_5)
	SELECT @ID_Value_Key_6 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_6)
	SELECT @ID_Value_Key_7 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_7)
	SELECT @ID_Value_Key_8 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_8)
	SELECT @ID_Value_Key_9 = ID FROM KeyValues WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType AND KeyValues.KeySource = @Value_Key_9)

-- записываем основную и вспомогательную таблицу
    UPDATE KeyValues SET CRC = @CRC, Processed = 0, DataProcessed = Null  
    WHERE  (KeyValues.KeySource = @KeyObject AND KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType);
    IF NOT EXISTS (SELECT ID FROM CurrentPackages WHERE (CurrentPackages.ID_Key = @IDObject AND CurrentPackages.ID_Source = @IDSource AND CurrentPackages.ID_Destination = @IDDestination)) 
	  INSERT INTO CurrentPackages (ID_Key, ID_Source, ID_Destination) VALUES (@IDObject, @IDSource, @IDDestination)
    UPDATE CurrentPackages SET 
		[Date] = @Date, 
		[Lot] = @Count, 
		[Sum] = @Sum, 
		Currency = @Currency, 
		comment = @comment, 
		Value_1 = @Value_1, 
		Value_2 = @Value_2, 
		Value_3 = @Value_3, 
		Value_4 = @Value_4, 
		Value_5 = @Value_5, 
		Value_6 = @Value_6, 
		Value_7 = @Value_7, 
		Value_8 = @Value_8, 
		Value_9 = @Value_9, 
		ID_Value_1 = @ID_Value_Key_1, 
		ID_Value_2 = @ID_Value_Key_2, 
		ID_Value_3 = @ID_Value_Key_3, 
		ID_Value_4 = @ID_Value_Key_4, 
		ID_Value_5 = @ID_Value_Key_5, 
		ID_Value_6 = @ID_Value_Key_6, 
		ID_Value_7 = @ID_Value_Key_7, 
		ID_Value_8 = @ID_Value_Key_8, 
		ID_Value_9 = @ID_Value_Key_9 
    WHERE  (CurrentPackages.ID_Key = @IDObject AND CurrentPackages.ID_Source = @IDSource AND CurrentPackages.ID_Destination = @IDDestination);

-- возвращаем не связанные ссылки
   SELECT KeySource 
   FROM
     (SELECT * 
     FROM KeyValues 
     WHERE (KeyValues.ID_Source = @IDSource AND KeyValues.ID_Destination = @IDDestination AND KeyValues.ID_Type = @IDType)
	 ) as t1
   WHERE 
     ((t1.KeyDestination is null OR len(t1.KeyDestination) = 0) AND
       (t1.KeySource = @Value_Key_1 OR t1.KeySource = @Value_Key_2 OR t1.KeySource = @Value_Key_3 OR t1.KeySource = @Value_Key_4 OR t1.KeySource = @Value_Key_5 OR t1.KeySource = @Value_Key_6 OR t1.KeySource = @Value_Key_7 OR t1.KeySource = @Value_Key_8 OR t1.KeySource = @Value_Key_9)
	 )

END


вызов ХП

DECLARE	@IDSession1 char(200)
DECLARE @KeySource1 char(200) = 'UH_Copy'
DECLARE @PassSource1 char(200) = '112'

--EXEC [dbo].[Authorization]  @KeySource1, @PassSource1, @IDSession1;

select @IDSession1 = 'ADAFBA3F-51C4-463A-BF90-37BF6CA618E7'

DECLARE @KeyHost1 char(200) = 'Voshod_buh_Copy'
DECLARE @TypeObject1 char(200) = 'CashFlow'
DECLARE	@KeyObject1 char(200)='eerrrr'
DECLARE	@CRC1 char(200)='45655'
DECLARE	@Date1 date

EXEC [dbo].[Export_Object] @IDSession1, @KeyHost1, @KeyObject1, @TypeObject1, @CRC1, @Date1, 1,	22, '',	'',
	'',	'',	'',	'',	'',	'',	'',	'', '',
	'rttt',	'4eerr', null,	null, null, null, null, null, null





ps
заодно если подскажете как покрасивее написать - буду благодарен, ибо опыт есть только по простым вещам..

Сообщение было отредактировано: 5 июн 17, 14:05
5 июн 17, 13:51    [20540148]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
aleks2
Guest
Ключевое слово "вроде".

Тут один недавно "исполнял"... то ли на разных базах, то ли разных схемах.

Для чайников - отладчик придумали.
5 июн 17, 14:11    [20540286]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6801
aleks2
Ключевое слово "вроде".

Тут один недавно "исполнял"... то ли на разных базах, то ли разных схемах.

Для чайников - отладчик придумали.

угу, судя по тому что тоже без схемы, то может и та же проблема
SELECT @IDDestination = ID FROM Sources WHERE (Sources.KeySource = @KeyHost);
5 июн 17, 14:25    [20540359]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
vde69
Member

Откуда: Москва
Сообщений: 2247
в отладчике после

EXEC [dbo].[Authorization]  @KeySource1, @PassSource1, @IDSession1;


параметр @IDSession1 не заполнен, хотя внутри присвоение идет, и если дергаю ХП по адо - этот параметр возвращается ...
5 июн 17, 15:33    [20540684]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
vde69
в отладчике после
EXEC [dbo].[Authorization]  @KeySource1, @PassSource1, @IDSession1;

параметр @IDSession1 не заполнен, хотя внутри присвоение идет, и если дергаю ХП по адо - этот параметр возвращается ...
Так подсказка помогла, в этом было дело?
Или вы не читаете ответов?
5 июн 17, 15:37    [20540703]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
vde69
Member

Откуда: Москва
Сообщений: 2247
короче разобрался

надо так
EXEC [dbo].[Authorization]  @KeySource1, @PassSource1, @IDSession1 OUTPUT;
5 июн 17, 15:38    [20540707]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31354
TaPaK
угу, судя по тому что тоже без схемы, то может и та же проблема
SELECT @IDDestination = ID FROM Sources WHERE (Sources.KeySource = @KeyHost);

Так там и @IDSource получается без схемы, из "CurrentSession"
Вот она и пустая.
5 июн 17, 15:38    [20540709]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
vde69
Member

Откуда: Москва
Сообщений: 2247
alexeyvg
TaPaK
угу, судя по тому что тоже без схемы, то может и та же проблема
SELECT @IDDestination = ID FROM Sources WHERE (Sources.KeySource = @KeyHost);

Так там и @IDSource получается без схемы, из "CurrentSession"
Вот она и пустая.


покажи как правильно со схемой (я что-то не вижу, неужели во все запросы к каждой таблице схему писать?)...


зы
проблема была в том, что я в вызове ХП параметр не определил как OUTPUT, вот он и не возвращался, ну а далее мне все понятно...
5 июн 17, 15:44    [20540734]     Ответить | Цитировать Сообщить модератору
 Re: ошибки внутри ХП  [new]
iap
Member

Откуда: Москва
Сообщений: 46977
vde69
неужели во все запросы к каждой таблице схему писать?
И не только к таблицам!
Ко всем объектам.
5 июн 17, 15:51    [20540763]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить