Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > MS SQL Server > В хранимых процедурах не работает функция ISNULL


Автор: Medved 6.11.2004, 15:42
Вот быстренько набросал тестовой примерчик, где я создаю таблицы и ХП:

Код

if exists (select * from dbo.sysobjects where id = object_id(N'[members]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [members]
GO

CREATE TABLE [members] (
[id]               [int] IDENTITY (1, 1)   NOT NULL
,[msname]          [varchar] (255)         NOT NULL
 ) ON [PRIMARY]
GO


if exists (select * from dbo.sysobjects where id = object_id(N'[up_members]') and OBJECTPROPERTY(id, N'IsProcedure') = 1)
drop procedure [up_members]
GO

CREATE PROCEDURE [up_members];1
        @out_id                  [int] OUTPUT
,@in_msname              [varchar] (255)
AS
   SET SELECT  @out_id = ISNULL(@@IDENTITY,0) + 1 FROM members  
 
 SET
 INSERT members (msname)
 VALUES (@in_msname)
GO



Вот выполняю:
Код

DECLARE @varit INT

EXEC up_members;1 @varit OUTPUT, 'assa'

SELECT [ID] = @varit
GO



При вставке первой записи вновь созданную таблицу, ISNULL возвращает NULL, хотя по идее должен 0.

MSSQL2000.

Автор: Medved 6.11.2004, 16:09
Если заменить:
Код

 SET SELECT  @out_id = ISNULL(@@IDENTITY,0) + 1 FROM members  

На:
Код
   
   SET SELECT  @out_id = @@IDENTITY+1 FROM members  
   IF @out_id IS NULL
   BEGIN
     SET  @out_id = 1
   END


То все работает как надо, но мне хотелось бы более красивого решения.

Автор: Euclid 16.12.2004, 20:09
Цитита
CREATE PROCEDURE [up_members];1
@out_id [int] OUTPUT
,@in_msname [varchar] (255)
AS
SET SELECT @out_id = ISNULL(@@IDENTITY,0) + 1 FROM members

SET
INSERT members (msname)
VALUES (@in_msname)
GO

Судя по тексту вначале
SET SELECT @out_id = ISNULL(@@IDENTITY,0) + 1 FROM members
а потом вставка новой записи
INSERT members (msname)
VALUES (@in_msname)

то есть для строчки: SET SELECT @out_id = ISNULL(@@IDENTITY,0) + 1 FROM members
в таблице members еше нет ни одной записи, это значит, что запрос вообще не обрабатывается и переменной @out_id ничего не присваивается, то есть она остается NULL, и это не зависит никака от того, что написано после знака =

Это типичная ситуация
declare @v int ( тип любой )
SET @v = isnull(что-нибудь, 0) from TABLE where....
если записи с выбранным условием отсутсвуют, то isnull просто не вызывается и
у @v остается значение, которое было до строчки SET, в данном случае NULL








Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)