INSERT ..... SELECT .... за раз
От: prockrut  
Дата: 20.11.06 11:46
Оценка:
народ, подскажите!

можно ли в одном запросе через ODBC вставить строку и получить ее IDENTITY
если да, то как это правильно сделать


SQLExecDirect(hStmt, "INSERT INTO MyTable(...)VALUES(...) SELECT @@IDENTITY AS [identity]", SQL_NTS);

не помогает.

— в таблице поле identity присутсвует
— новая запись в строке появляется
— но id не возвращается,

в два запроса все работает

SQLExecDirect(hStmt, "INSERT INTO MyTable(...)VALUES(...)", SQL_NTS);
SQLExecDirect(hStmt, "SELECT @@IDENTITY AS [identity]", SQL_NTS);
Re: INSERT ..... SELECT .... за раз
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 20.11.06 11:55
Оценка:
Здравствуйте, prockrut, Вы писали:

P>народ, подскажите!


P>можно ли в одном запросе через ODBC вставить строку и получить ее IDENTITY

P>если да, то как это правильно сделать


Можно попытаться сделать встроенную процедуру и передать identity оттуда в качестве output параметра.

ЗЫ. Вместо @@identity лучше использовать scope_identity(), так как в случае наличия на таблице триггеров, вставляющих данные в другие таблице @@identity вернет значение счетчика не из той таблицы.
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[2]: INSERT ..... SELECT .... за раз
От: prockrut  
Дата: 20.11.06 13:37
Оценка:
S>Можно попытаться сделать встроенную процедуру и передать identity оттуда в качестве output параметра.

S>ЗЫ. Вместо @@identity лучше использовать scope_identity(), так как в случае наличия на таблице триггеров, вставляющих данные в другие таблице @@identity вернет значение счетчика не из той таблицы.



Не нашел, что значит встроенная процедура
Сделал Stored Procedure
Вопрос: как извлечь id?


==================================================================
CREATE PROCEDURE NewObject
@Name nvarchar,
@id int
AS

INSERT INTO MyObjects([Name]) VALUES(@Name)
SET @id= @@IDENTITY -- либо SCOPE_IDENTITY()
GO
==================================================================



Вариант
SQLExecDirect(hStmt, "DECLARE @id int EXECUTE CreateAsset NewObject, 'Name' @id OUTPUT SELECT @id AS [Identity]", SQL_NTS);


Опять же не проходит
запись добавляется
результат 0 Col 1 Row (те не возвращает)

Хелп, что я не так сделал?
Re[3]: INSERT ..... SELECT .... за раз
От: Sshur Россия http://shurygin-sergey.livejournal.com
Дата: 20.11.06 13:46
Оценка:
Здравствуйте, prockrut, Вы писали:

S>>Можно попытаться сделать встроенную процедуру и передать identity оттуда в качестве output параметра.


S>>ЗЫ. Вместо @@identity лучше использовать scope_identity(), так как в случае наличия на таблице триггеров, вставляющих данные в другие таблице @@identity вернет значение счетчика не из той таблицы.



P>Не нашел, что значит встроенная процедура

P>Сделал Stored Procedure
P>Вопрос: как извлечь id?

Чтобы значение возвращалось надо делать так:



==================================================================
CREATE PROCEDURE NewObject
@Name nvarchar,
@id int output
AS
INSERT INTO MyObjects([Name]) VALUES(@Name)
SET @id= @@IDENTITY -- либо SCOPE_IDENTITY()
GO
==================================================================



P>Вариант

P>
P>SQLExecDirect(hStmt, "DECLARE @id int EXECUTE CreateAsset NewObject, 'Name' @id OUTPUT SELECT @id AS [Identity]", SQL_NTS);
P>


P>Опять же не проходит



По работе с ODBC я не большой советчик, могу сказать только что надо параметры привязывать к команде посредством SQLBindParameter, и смотреть потом после выполнения команды. Если SQLExecDirect с параметрами не работает, то придеться использовать SQLPrepareStmt/SQLExec (за правильность названий не ручаюсь).
Шурыгин Сергей

"Не следует преумножать сущности сверх необходимости" (с) Оккам
Re[4]: INSERT ..... SELECT .... за раз
От: Аноним  
Дата: 20.11.06 14:00
Оценка:
To Sshur, спасибо!

про SQLPrepareStmt/SQLExec почитаем

ps. OUTPUT случайно выкинул когда код для упрощал
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.