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

Откуда: Санкт-Петербург
Сообщений: 520
Добрый день!

Пишу хранимую процедуру.

USE [Bulk_Details_Control]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO

ALTER PROCEDURE [dbo].[AddDetail] 
	-- Add the parameters for the stored procedure here
	@Adetail_name as varchar(50) ,
	@Adetail_address as varchar(50) 
AS
BEGIN
	declare @Aid_detail uniqueidentifier
	declare @ADetail_number int =0
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;
	
	select @Aid_detail=id_detail from Detail_name where detail_name=@Adetail_name
	
	if @Aid_detail is NULL
	begin
		insert into Detail_name (id_detail,detail_name)
		values
		(NEWID(),@Adetail_name)
	end
		
		select @Aid_detail=dn.id_detail, @ADetail_number=m.detail_number 
		from 
		Detail_name dn
		left join Main m on
		dn.id_detail=m.id_detail 
		where dn.detail_name=@Adetail_name   --получаю id|Null
		
	if @ADetail_number is null --т.к. в переменную @ADetail_number мы записали Null
	set @ADetail_number=1	 --то присваиваю ей единицу
		-- вот именно здесь и не происходит присваивание.
		
		insert into Main (id_detail,detail_number,detail_address) --запрос естественно не отрабатывает, т.к. @ADetail_number = null
		values
		(@Aid_detail,@ADetail_number,@Adetail_address)	

END


Вопрос :)
почему не происходит выполнение команды
set @ADetail_number=1	
. Что я делаю не так?

Никогда не бойся делать то, что не умеешь.
Помни, профессионалы построили Титаник, а Ковчег любители.
19 фев 14, 13:42    [15589661]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
автор
т.к. в переменную @ADetail_number мы записали Null

Ага - declare @ADetail_number int =0
19 фев 14, 13:45    [15589703]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Kast2K
Вопрос :)
почему не происходит выполнение команды
set @ADetail_number=1	
. Что я делаю не так?
Очевидно, потому, что @ADetail_number is NOT null
19 фев 14, 13:49    [15589756]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Запрос
select dn.id_detail, m.detail_number 
		from 
		Detail_name dn
		left join Main m on
		dn.id_detail=m.id_detail 
		where dn.detail_name=@Adetail_name

сколько строк возвращает?

Сообщение было отредактировано: 19 фев 14, 13:52
19 фев 14, 13:51    [15589785]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
tpg,

только 1 строку
19 фев 14, 14:23    [15590180]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
фаина-фаина
Guest
Вы же собственноручно присвоили занчение 0 при инициализации declare @ADetail_number int =0

Теперь конечно под условие IS NULL она не попадает. Скорее всего вы имели ввиду( if @ADetail_number = 0) условие
19 фев 14, 14:52    [15590449]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Чудес не бывает. Либо
		select @Aid_detail=dn.id_detail, @ADetail_number=m.detail_number 
		from 
		Detail_name dn
		left join Main m on
		dn.id_detail=m.id_detail 
		where dn.detail_name=@Adetail_name
возвращает пустой набор, либо m.detail_number не null.
19 фев 14, 15:04    [15590587]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31964
Kast2K
Вопрос :)
почему не происходит выполнение команды
Это отлаживается за минуту. Навставляйте селектов, и посмотрите, что там с запросами и переменными. Отсюда не увидеть, что там в таблицах.
19 фев 14, 15:12    [15590685]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
buser
Member

Откуда: Санкт-Петербург
Сообщений: 4539
Плюс не стоит забывать о различии select @ADetail_number =... и set @ADetail_number = (select ...
19 фев 14, 15:51    [15591063]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
Коллеги,
стыжусь, но не понимаю все равно.

таблица Detail_name
CREATE TABLE [dbo].[Detail_name](
	[id_detail] [uniqueidentifier] NOT NULL,
	[detail_name] [varchar](50) NOT NULL,
 CONSTRAINT [PK_Detail_name] PRIMARY KEY CLUSTERED 
(
	[id_detail] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]


состав таблицы
id_detail detail_name
27F38CA0-D3CB-4139-99C1-C225C629F238 | 1421414124
254DE0C7-8327-42FA-9BFA-E1149EFFAB96 | 123112414512

таблица Main
CREATE TABLE [dbo].[Main](
	[id_detail] [uniqueidentifier] NOT NULL,
	[detail_number] [int] NOT NULL,
	[detail_address] [uniqueidentifier] NOT NULL
) ON [PRIMARY]


таблица пустая.

В хранимой процедуре объявил переменную без 0 (ноля)
	declare @ADetail_number int;


выполняю запрос из процедуры

select dn.id_detail, m.detail_number 
		from 
		Detail_name dn
		left join Main m on
		dn.id_detail=m.id_detail 
		where dn.detail_name='1421414124'

Получаю ответ

id_detail detail_number
27F38CA0-D3CB-4139-99C1-C225C629F238 NULL

Далее, если пришло значение Null, то заменить его на 1

	if @ADetail_number is NULL
	begin
	set @ADetail_number=1;
	end;


при выполнении
	insert into Main (id_detail,detail_number,detail_address)
	values
	(@Aid_detail,@ADetail_number,@Adetail_address);	

SQL ругается, что
123
Cannot insert the value NULL into column 'detail_number', table 'Bulk_Details_Control.dbo.Main'; column does not allow nulls. INSERT fails.


Получается, что если вместо int я получаю Null, то он никак не обрабатывается?

Простите, но не могу понять, почему не происходит присвоение.
19 фев 14, 17:18    [15591871]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kast2K,

можно же перед и после IF написать SELECT @ADetail_number и посмотреть, присваивается или нет?!
19 фев 14, 17:24    [15591918]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Вообще не понимаю, зачем там какие-то переменные, IFы, присвоения?
19 фев 14, 17:25    [15591932]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
iap,

не присваивается
19 фев 14, 17:26    [15591935]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Kast2K
iap,

не присваивается
Краткость - сестра таланта
19 фев 14, 17:27    [15591950]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
iap,

Спасибо, разобрался.
19 фев 14, 17:28    [15591977]     Ответить | Цитировать Сообщить модератору
 Re: Ошибка в хранимой процедуре. Не происходит присваивание Set  [new]
Kast2K
Member

Откуда: Санкт-Петербург
Сообщений: 520
надо было всего лишь написать...
по хорошему на бумажке, но я нагадил на форум..
простите меня :)
19 фев 14, 17:29    [15591983]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить