Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пишу вторую в жизни хранимую процедуру. Поможите :) / 16 сообщений из 16, страница 1 из 1
24.08.2001, 04:21
    #32012727
VictorSvetlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
Задача: Есть таблица Unicator, в которой одна запись и куча полей. В ней хранятся идентификаторы для новых записей. При создании записи нужно получить результат, равных имеющемуся значению+1 и изменить имеющееся значение.

Пишу:
CREATE PROCEDURE [dbo].[SP_GetNewID]
@vchIDName varchar(30),
@iReturn int output
as
set nocount on
begin transaction
select @iReturn = (select (@vchIDName + 1) from Unicator)
Update Unicator Set @vchIDName = @iReturn
commit
GO

Тест на корректность проходит, процедура сохраняется. Но при вызове из Дельфи ругается:
'Syntax error converting the varchar value 'такое-то' to a column or data type int'.
Что я делаю неправильно?
...
Рейтинг: 0 / 0
24.08.2001, 05:07
    #32012731
VictorS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
Если под входным параметром процедуры подразумевается имя колонки из которой необходимо выбрать результат, то так работать не будет - оно не может передаваться в SQL запрос как переменная (только если весь запрос не формируется как строка а потом выполняется EXEC).
По- моему проще было бы иметь таблицу из двух полей: Имя последовательности и Следующее значение. Соответственно записей будет столько сколько есть последовательностей.
...
Рейтинг: 0 / 0
24.08.2001, 05:09
    #32012732
SergeyK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
@vchIDName varchar(30),
@iReturn int output
.......
select @iReturn = (select (@vchIDName + 1) from Unicator)*
.......

* - в этой строчке ты пытаешься прибавить к переменной типа varchar (@vchIDName) единицу.
Поэтому и выдает ошибку о несоответствии типов.
...
Рейтинг: 0 / 0
24.08.2001, 05:13
    #32012735
Alex
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
@iReturn int output
^^^^^^
Надо объявить переменную до вызова процедурины.
Например так:
DECLARE @iR INT
EXECUTE SP_GetNewID <входн. параметры>, @iReturn=@iR OUTPUT
PRINT @iR
GO
А вааще для идентификаторов лучше использовать св-во IDENTITY
...
Рейтинг: 0 / 0
24.08.2001, 05:15
    #32012737
SergeyK
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
Точно! Слона-то я и не приметил!

Только если он сформирует строку запроса и сделает sp_sqlexec, т.е.

select @sql_string='select @iReturn = ('+@vchIDName+' + 1) from Unicator)'
sp_sqlexec @sql_string

то как достучится до переменной @iReturn?

Компилятор будет ругаться, что такой переменной нет.
...
Рейтинг: 0 / 0
24.08.2001, 05:15
    #32012738
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
В общем начал разбираться, а потом бросил, советую другой подход если так уж нужно самому генерить айдишки, то заведите таблицу с тремя полями (можно с двумя в том случае,если нужен только один счетчик на одну таблицу) 1-е поле имя таблицы, 2-е поле имя столбца-айди, 3-е поле значение счетчика.
Таким образо у Вас будет таблица в которой будет столько записей, сколько счетчиков вам нужно.
Тогда процедура будет выглдядеть так:
CREATE PROCEDURE [dbo].[SP_GetNewID]
@TableName varchar(30),
@ColumnName varchar(30)
as
begin
set nocount on
begin transaction
update Counter set CounterValue = CounterValue + 1 where TableName = @TableName and CoulmnName = @ColumnName
select CounterValue as NewId where TableName = @TableName and CoulmnName = @ColumnName
commit transaction
end
GO

Вот так будет более эффективно, транзакцию надо начинать именно с апдейта для, того чтобы заблокировать запись и для чтения, тогда не будет дубликатов ключей.
Успехов
...
Рейтинг: 0 / 0
24.08.2001, 05:33
    #32012742
VictorSvetlov
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
Большое спасибо Не дали умереть от ламерства.
Вариант "одна запись - много полей" был выбран из предположения, что так быстрее и изначально придуман для Парадокса. Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи, а функции, аналогичной "NextVal(..) from Dual", как в Оракле я не нашел. Вроде ее нет.
Теперь сделаю таблицу из трех полей
...
Рейтинг: 0 / 0
24.08.2001, 05:37
    #32012744
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
>Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи
А зачем? Проблемы с подчиненными записями? Если так, то они решаются и с использованием Identity.
...
Рейтинг: 0 / 0
24.08.2001, 09:32
    #32012780
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
2Genady
>>Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи
>А зачем? Проблемы с подчиненными записями? Если так, то они решаются и с использованием Identity.
а как если не секрет? можно на мыло ...
...
Рейтинг: 0 / 0
24.08.2001, 09:48
    #32012783
Павел
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
А ты поделись, что именно хочещь реализовать?
...
Рейтинг: 0 / 0
24.08.2001, 10:30
    #32012799
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
>а как если не секрет?
Create procedure ForInsertParent
as
begin
declare @vNewId int
insert into ParentTable values(......)
set @vNewId = @@Identity
select @vNewId as ParentId
end

В результате выполнения процедуры получишь на клиенте рекордсет состоящий из поля ParentId и одной записи со значением этого айди.
...
Рейтинг: 0 / 0
24.08.2001, 10:33
    #32012800
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
Да, только если у Вас есть триггера, которые в ответ на вставку записи в парент, чего там тоже вставляют, то получите неправильный Айди, в этом случаи его надо считывать прямо из триггера перед вставкой в другие таблицы.
...
Рейтинг: 0 / 0
24.08.2001, 11:11
    #32012805
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
спасибо
жаль только что вставлять придется по одной записи, но в большинстве случаев это нормально
...
Рейтинг: 0 / 0
24.08.2001, 12:51
    #32012814
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
2 Denis
>жаль только что вставлять придется по одной записи

А если вставлять пакетом, так и никакой самопальный cOunter не поможет
Или Вы будуте возиться с массивом айдишек?
...
Рейтинг: 0 / 0
25.08.2001, 08:33
    #32012831
Denis
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
2Genady
разные бывают ситуации

лично мне приходилось при оптимизации создания многострочного документа, для избавления от цикла, формировать номера строк документа во временной таблице с ключом identity... существенно ускоряет работу могу заметить
...
Рейтинг: 0 / 0
27.08.2001, 05:31
    #32012868
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Пишу вторую в жизни хранимую процедуру. Поможите :)
>формировать номера строк документа во временной таблице с ключом identity...

Понятно о чем это я?
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Пишу вторую в жизни хранимую процедуру. Поможите :) / 16 сообщений из 16, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]