Модераторы: Akina
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> В хранимых процедурах не работает функция ISNULL, почему? 
:(
    Опции темы
Medved
Дата 6.11.2004, 15:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



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

Код

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.


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Medved
Дата 6.11.2004, 16:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 7209
Регистрация: 15.9.2002
Где: Kazakhstan, Astan a

Репутация: нет
Всего: 154



Если заменить:
Код

 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


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


--------------------
http://extreme.sport-express.ru/
...и неважно сколько падал, важно сколько ты вставал...
PM MAIL WWW ICQ Skype GTalk   Вверх
Euclid
Дата 16.12.2004, 20:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 26.10.2004

Репутация: 1
Всего: 1



Цитита
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








PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "MS SQL"
Akina

Akina

Запрещается!

Публиковать ссылки и обсуждать взлом чего бы то ни было.

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы составления неспецифических запросов рассматриваются здесь
  • Используйте теги [code=sql][/code] для подсветки кода. Используйтe чекбокс "транслит" (возле кнопок кодов) если у Вас нет русских шрифтов.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Zloxa, Akina.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MS SQL Server | Следующая тема »


 




[ Время генерации скрипта: 0.0424 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.