Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.53/17: Рейтинг темы: голосов - 17, средняя оценка - 4.53
slai
0 / 0 / 1
Регистрация: 28.09.2010
Сообщений: 57
1

Написать процедуру в MSQL которая будет вставлять строку в таблицу act_new и возвращать параметр id

04.10.2010, 09:33. Просмотров 3221. Ответов 5
Метки нет (Все метки)

Добрый день.
Помогите написать процедуру в MSQL которая будет вставлять строку в таблицу act_new и возвращать параметр id.
0
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.10.2010, 09:33
Ответы с готовыми решениями:

Функция, которая будет добавлять новую строку в таблицу и возвращать id
В таблице есть 2 столбца. (Id, Name). Нужно перед добавлением проверить есть ли уже такое значение...

.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить таблицу значений этой функции
.Написать функцию, которая будет возвращать значение y=ln(x)+x при входящем параметре x. Построить...

определить подпрограмму, которая будет возвращать строку
определить подпрограмму, которая будет возвращать строку "база данных" Нуждаюсь в помощи...без...

Написать функцию, которая будет возвращать величину среднего абсолютного отклонения
Нужно написать в vba функцию, которая будет возвращать 1 Величину среднего абсолютного отклонения...

Написать функцию, которая будет возвращать возраст человека на любую произвольную дату
Написать функцию, которая будет возвращать возраст человека на любую произвольную дату.

5
nio
5975 / 3381 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
04.10.2010, 13:57 2
Вот пример процедуры которая вставляет данные в таблицу заказов
SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
ALTER PROCEDURE [dbo].[procedure_InsertOrder]
    
    (   
    @ID_Order INT OUTPUT,
    @DATE Datetime, 
    @ID_Client INT, 
    @ID_Device INT  
    )
    
AS
    INSERT INTO [ORDER]
                          (DATE, ID_Client, ID_Device)
    VALUES     (@DATE,@ID_Client,@ID_Device)
    
    SET @ID_Order=@@IDENTITY
    RETURN
0
new_in_net
278 / 257 / 32
Регистрация: 11.11.2009
Сообщений: 605
04.10.2010, 19:43 3
Лучший ответ Сообщение было отмечено как решение

Решение

согласен с предыдущим оратором, только у меня есть маленькое замечание:

очень сильно рекомендую использовать не @@Identity который возвращает значение последнего введенного идентификатора а функцию SCOPE_IDENTITY() которая возвращает значение последнего введенного идентификатора внутри того же блока (the same scope).

В таблице на событие INSERT могут быть тригеры, которые в свою очередь могут вставлять строки с ID, и в таком случае полученный ID с помощью @@Identity будет непонятно чем.
3
Башир
207 / 207 / 20
Регистрация: 18.05.2010
Сообщений: 846
05.10.2010, 11:22 4
Цитата Сообщение от new_in_net Посмотреть сообщение
согласен с предыдущим оратором, только у меня есть маленькое замечание:

очень сильно рекомендую использовать не @@Identity который возвращает значение последнего введенного идентификатора а функцию SCOPE_IDENTITY() которая возвращает значение последнего введенного идентификатора внутри того же блока (the same scope).

В таблице на событие INSERT могут быть тригеры, которые в свою очередь могут вставлять строки с ID, и в таком случае полученный ID с помощью @@Identity будет непонятно чем.
Большой спасибо за информацию, кстати очень ценная и может быть источником ошибок которых почти не возможно обнаружить.

Но все же поясните до конци и ответьте на вопрос? @@IDENTITY может так же вернуть значение которое было вставлено даже другой таблицей? т.е. если в момент выполнения процедуры в другой сесии произошла вставка строки в другой таблице которая произошла после вставки в этой процедуре то что вернет @@IDENTITY и что вернет SCOPE_IDENTITY()?
например
SQL
1
2
3
4
5
6
7
8
9
CREATE proc P1
@Param1 INT,
//.....
AS
DECLARE @ID INT
INSERT INTO t1(f1) VALUES(@Param1)
//.... какието действия 1
SET @ID=@@IDENTITY
RETURN @ID
и в другой процедуре в другой сессии связи происходт подобное, а именно вствака в момент когда P1 находится в выполнении
//.... какието действия 1
SQL
1
2
3
4
5
6
7
8
9
CREATE proc P2
@Param1 INT,
//.....
AS
DECLARE @ID INT
INSERT INTO t2(f1) VALUES(@Param1)
//.... какието действия 2
SET @ID=@@IDENTITY
RETURN @ID
и как поведет себя в этом случае SCOPE_IDENTITY()? Вопрос очень тонко поставлен
0
nio
5975 / 3381 / 335
Регистрация: 14.06.2009
Сообщений: 8,136
Записей в блоге: 2
05.10.2010, 11:54 5
Да есть заморочка Странно что об этом в книгах по MSSQL ничего не написано
Вот что об этом говорит MSDN:

Функции SCOPE_IDENTITY и @@IDENTITY возвращают последние значения идентификатора, созданные в таблицах во время текущего сеанса. Однако функция SCOPE_IDENTITY возвращает значения, вставленные только в рамках текущей области, тогда как действие функции @@IDENTITY не ограничивается никакими областями.

Например, существует две таблицы, T1 и T2, и для таблицы T1 определен триггер INSERT. Когда в таблицу T1 вставляется строка, триггер срабатывает и добавляет строку в таблицу T2. В этом сценарии используются две области: вставка в таблицу T1 и вставка триггером в таблицу T2.

Допуская, что столбец идентификаторов имеется в обеих таблицах, T1 и T2, функции @@IDENTITY и SCOPE_IDENTITY вернут разные значения в конце инструкции INSERT в таблице T1. Функция @@IDENTITY возвращает значение столбца идентификаторов, добавленное в текущем сеансе последним во всех областях. Это значение, вставленное в таблицу T2. Функция SCOPE_IDENTITY() возвратит значение IDENTITY, вставленное в таблицу T1. Это было последним добавлением, произошедшим в заданной области. Функция SCOPE_IDENTITY() вернет значение NULL, если функция была вызвана до того, как какая-либо инструкция INSERT была выполнена для столбца идентификаторов в этой области.

Неудачно завершившиеся инструкции и транзакции могут изменить текущий идентификатор таблицы и создать пропуски в значениях столбца идентификаторов. Для значения идентификатора никогда не производится откат, несмотря на то, что транзакция, пытавшаяся вставить в таблицу значение, не была зафиксирована. Например, если инструкция INSERT привела к ошибке из-за нарушения ограничения IGNORE_DUP_KEY, текущий идентификатор для таблицы все равно увеличивается.

При этом речь идет об одном сеансе, т.е. для текущего пользователя, если одновременноо будут вносится дданные другими пользователями, то значения SCOPE_IDENTITY и @@IDENTITY все-равно будут представлены для текущего пользователя. Для того что бы получать последний ID от любого пользователя используется IDENT_CURRENT( 'table_name' )

MSDN:IDENT_CURRENT возвращает последнее значение идентифицирующего столбца, созданное для конкретной таблицы в любом сеансе и области поиска.

Добавлено через 4 минуты
так что в данном случае конечно целесообразнее использовать SCOPE_IDENTITY, хотя если разработчик уверен, что нет (и не будет) завязаных тригеров и/или других программых средств, работающих с ID, то можно обойтись и @@IDENTITY

Добавлено через 1 минуту
new_in_net, спасибо, что обратил внимание на такую тему
3
Башир
207 / 207 / 20
Регистрация: 18.05.2010
Сообщений: 846
05.10.2010, 14:04 6
nio, Cпасибо за то что разжевали эту тему
0
05.10.2010, 14:04
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
05.10.2010, 14:04

Написать функцию, которая будет возвращать уравнение прямой. Помогите найти ошибку.
нужно написать функцию, которая будет возвращать уравнение прямой AB. Я написал ее, но не могу...

Написать функцию, которая будет возвращать возраст человека на любую произвольную дату
Мне здесь уже предлагали решение, но, как потом я поняла, оно неверное. Вообщем, на форме нужно...

Написать процедуру, которая будет удалять повторяющиеся элементы списка
Помогите написать процедуру(в коде она Delete2) которая будет удалять повторяющиеся элементы...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2019, vBulletin Solutions, Inc.
Рейтинг@Mail.ru