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

Откуда: Москва
Сообщений: 70
СУБД: MS SQL Server
Задача:
Есть таблица "table" в которой поле "uid" заполняется по дефолту результатами функции newid(). Нужна процедура, которая, во-первых, заполняет все поля в "table" за исключением поля "uid", а во-вторых, возвращает приложению значение поля "uid", полученное функцией newid().
25 дек 09, 16:58    [8120047]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
rast
СУБД: MS SQL Server
Задача:
Есть таблица "table" в которой поле "uid" заполняется по дефолту результатами функции newid(). Нужна процедура, которая, во-первых, заполняет все поля в "table" за исключением поля "uid", а во-вторых, возвращает приложению значение поля "uid", полученное функцией newid().
Заполняет чем?
25 дек 09, 17:00    [8120062]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
[/quot]Заполняет чем?[/quot]

Пусть таблица 'table' содержит поля 'uid' uniqueidentifier, 'name' char, 'email' char.
Так вот процедура должна вставить значения в поля 'name' и 'email' и возвратить значение 'uid'.
25 дек 09, 17:08    [8120115]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast
Так вот процедура должна вставить значения в поля 'name' и 'email' и возвратить значение 'uid'.

И в чем проблема написать в процедуре стандартную команду INSERT c опцией OUTPUT ?
25 дек 09, 17:10    [8120127]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
vino
Member

Откуда:
Сообщений: 1191
Glory, пусть сначала rast версию укажет
25 дек 09, 17:14    [8120150]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Glory,

у меня получается следующее:
create proc 'test'

@name char,
@email char

as
begin
insert into 'test' (name, email)
values (@name, @email)
end

эта процедура вставляет данные. А как вернуть приложению сгенерированный 'uid'?
25 дек 09, 17:15    [8120157]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
MS SQL Server 2005 Enterprise sp2
25 дек 09, 17:17    [8120163]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast
to Glory,

у меня получается следующее:
create proc 'test'

@name char,
@email char

as
begin
insert into 'test' (name, email)
values (@name, @email)
end

эта процедура вставляет данные. А как вернуть приложению сгенерированный 'uid'?

"стандартную команду INSERT c опцией OUTPUT "
25 дек 09, 17:17    [8120165]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Автор, а почему имя и адрес имеют тип char а не varchar ?
25 дек 09, 17:18    [8120169]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Glory: спасибо, понял.
25 дек 09, 17:21    [8120177]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
Кому интересен результат, получилось следующее:

create proc test

@name char,
@email char
@uid uniqueidentifier OUTPUT
as
begin
insert into table (name, email)
values (@name, @email);
select
@uid = uid
from
table
where
[email] = @email
end
25 дек 09, 18:19    [8120400]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast
Кому интересен результат, получилось следующее:

И что будет, если таких @email-ов несколько одинаковых в таблице ?
25 дек 09, 18:21    [8120404]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Ну во-первых Вы не прочли в документации про опцию OUTPUT команды INSERT
А во-вторых, Вы почему-то не ответили на мой вопрос про типы данных
25 дек 09, 18:23    [8120407]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
rast
Кому интересен результат, получилось следующее:

create proc test

@name char,
@email char
@uid uniqueidentifier OUTPUT
as
begin
insert into table (name, email)
values (@name, @email);
select
@uid = uid
from
table
where
[email] = @email
end
Только не понятно зачем делать запрос к таблице, когда можно просто сгенерить uid в переменную, вставить его и вернуть. Наверное, чтобы быстрее работало.
25 дек 09, 18:25    [8120415]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36817
И еще - у вас все емейлы и имена будут длиной в 1 байт.
25 дек 09, 18:26    [8120416]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Гавриленко Сергей Алексеевич and Паганель: Указанные переменные приведены для простоты; мне важно было понять как это работает (я никогда не писал процедур).

to Glory: предполагается, что пользователь будет регистрироваться в системе, указывая мыло; приложению нужно вернуть uid соответствующий мылу.
25 дек 09, 18:46    [8120455]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
rast
Указанные переменные приведены для простоты
Я не про переменные, а про поля в таблице
Вы не спрашивали у того, кто Вам эту БД спроектировал - почему char а не varchar ?
25 дек 09, 18:49    [8120462]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast

to Glory: предполагается, что пользователь будет регистрироваться в системе, указывая мыло; приложению нужно вернуть uid соответствующий мылу.

Замечательно. И что будет то при регистрации двух пользователей с одинаковыми эмейлами ?
25 дек 09, 18:53    [8120475]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Паганель: это тестовая БД с одной единственной таблицей; сам набросал, только для того чтобы разобраться с процедурами. Повторюсь, я на этапе освоения.
25 дек 09, 18:57    [8120490]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Glory: Думаю можно добавить поле "activationcode" и получать id-шники соответствующие комбинации e-mail + activationcode. А activationcode пусть генерируется функ-ей newsequentialid()
25 дек 09, 19:03    [8120508]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast
to Glory: Думаю можно добавить поле "activationcode" и получать id-шники соответствующие комбинации e-mail + activationcode. А activationcode пусть генерируется функ-ей newsequentialid()

А uid зачем тогда ?
Это как в истории, где "я всегда компостирую второй билет на тот случай, если первый билет я потеряю" ?
25 дек 09, 19:28    [8120548]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
rast
Member

Откуда: Москва
Сообщений: 70
to Glory: думаю наличие и uid и activationcode решит проблему идентификации пользователей с одинаковыми электронными адресами. Готов к конструктивной критике.
25 дек 09, 19:46    [8120596]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Glory
Member

Откуда:
Сообщений: 104760
rast
to Glory: думаю наличие и uid и activationcode решит проблему идентификации пользователей с одинаковыми электронными адресами. Готов к конструктивной критике.

И в 3ий раз я говорю про опцию OUTPUT команды INSERT
25 дек 09, 19:57    [8120624]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Juriy D
Member

Откуда: Киев
Сообщений: 36
Ув. rast, попробуйте разобраться в след. коде:

if object_id ('dbo.test','T') is not null 
	drop table test
go
create table test (id uniqueidentifier default newid() primary key not null,
				   ename varchar(25) not null,email varchar (25) not null)
go
if object_id ('dbo.filler','p') is not null
   drop procedure dbo.filler
go
create procedure dbo.filler
	@name as varchar(40),
	@email as varchar (40),
	@id as uniqueidentifier OUTPUT
as
declare @temptabl table (id uniqueidentifier)
insert test(ename,email) output inserted.id into @temptabl values (@name,@email)
select @id=id from @temptabl
go
declare @id uniqueidentifier
exec dbo.filler 'yuza','yuzversk@rambler.ru',@id output
select @id
select * from test
26 дек 09, 11:58    [8121670]     Ответить | Цитировать Сообщить модератору
 Re: Нужна помощь в написании хранимой процедуры.  [new]
Juriy D
Member

Откуда: Киев
Сообщений: 36
rast, sorry в коде ошибка в первой же строчке :
if object_id ('dbo.test','U') is not null
drop table test
26 дек 09, 12:10    [8121682]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить