Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
Задача: Есть таблица 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'. Что я делаю неправильно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 04:21 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
Если под входным параметром процедуры подразумевается имя колонки из которой необходимо выбрать результат, то так работать не будет - оно не может передаваться в SQL запрос как переменная (только если весь запрос не формируется как строка а потом выполняется EXEC). По- моему проще было бы иметь таблицу из двух полей: Имя последовательности и Следующее значение. Соответственно записей будет столько сколько есть последовательностей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:07 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
@vchIDName varchar(30), @iReturn int output ....... select @iReturn = (select (@vchIDName + 1) from Unicator)* ....... * - в этой строчке ты пытаешься прибавить к переменной типа varchar (@vchIDName) единицу. Поэтому и выдает ошибку о несоответствии типов. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:09 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
@iReturn int output ^^^^^^ Надо объявить переменную до вызова процедурины. Например так: DECLARE @iR INT EXECUTE SP_GetNewID <входн. параметры>, @iReturn=@iR OUTPUT PRINT @iR GO А вааще для идентификаторов лучше использовать св-во IDENTITY ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:13 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
Точно! Слона-то я и не приметил! Только если он сформирует строку запроса и сделает sp_sqlexec, т.е. select @sql_string='select @iReturn = ('+@vchIDName+' + 1) from Unicator)' sp_sqlexec @sql_string то как достучится до переменной @iReturn? Компилятор будет ругаться, что такой переменной нет. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:15 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
В общем начал разбираться, а потом бросил, советую другой подход если так уж нужно самому генерить айдишки, то заведите таблицу с тремя полями (можно с двумя в том случае,если нужен только один счетчик на одну таблицу) 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 Вот так будет более эффективно, транзакцию надо начинать именно с апдейта для, того чтобы заблокировать запись и для чтения, тогда не будет дубликатов ключей. Успехов ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:15 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
Большое спасибо Не дали умереть от ламерства. Вариант "одна запись - много полей" был выбран из предположения, что так быстрее и изначально придуман для Парадокса. Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи, а функции, аналогичной "NextVal(..) from Dual", как в Оракле я не нашел. Вроде ее нет. Теперь сделаю таблицу из трех полей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:33 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
>Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи А зачем? Проблемы с подчиненными записями? Если так, то они решаются и с использованием Identity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 05:37 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
2Genady >>Использовать IDENTITY не могу, т.к. нужно знать ID до сохранения записи >А зачем? Проблемы с подчиненными записями? Если так, то они решаются и с использованием Identity. а как если не секрет? можно на мыло ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 09:32 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
А ты поделись, что именно хочещь реализовать? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 09:48 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
>а как если не секрет? Create procedure ForInsertParent as begin declare @vNewId int insert into ParentTable values(......) set @vNewId = @@Identity select @vNewId as ParentId end В результате выполнения процедуры получишь на клиенте рекордсет состоящий из поля ParentId и одной записи со значением этого айди. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 10:30 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
Да, только если у Вас есть триггера, которые в ответ на вставку записи в парент, чего там тоже вставляют, то получите неправильный Айди, в этом случаи его надо считывать прямо из триггера перед вставкой в другие таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 10:33 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
спасибо жаль только что вставлять придется по одной записи, но в большинстве случаев это нормально ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 11:11 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
2 Denis >жаль только что вставлять придется по одной записи А если вставлять пакетом, так и никакой самопальный cOunter не поможет Или Вы будуте возиться с массивом айдишек? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.08.2001, 12:51 |
|
||
|
Пишу вторую в жизни хранимую процедуру. Поможите :)
|
|||
|---|---|---|---|
|
#18+
2Genady разные бывают ситуации лично мне приходилось при оптимизации создания многострочного документа, для избавления от цикла, формировать номера строк документа во временной таблице с ключом identity... существенно ускоряет работу могу заметить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.08.2001, 08:33 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3551&tid=1825758]: |
0ms |
get settings: |
6ms |
get forum list: |
10ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
3ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 267ms |
| total: | 386ms |

| 0 / 0 |
