Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Можно ли както данные из Output присвоить в переменную? Или только в таблицу? ALTER PROCEDURE [dbo].[spUpdate] @id int OUT, @title nvarchar(50)=null AS SET NOCOUNT ON; select @ID=ID from ( MERGE tableIn USING (SELECT @id, @title) AS source (id, title) ON (tableIn.id = source.id) WHEN MATCHED AND source.title is null THEN DELETE WHEN MATCHED THEN UPDATE SET title = source.title WHEN NOT MATCHED and source.title is not null THEN INSERT (title) VALUES (source.title) Output $action as Act ,inserted.ID )AS Changes (Act, ID) where Act='INSERT'; Msg 10729, Level 15, State 1, Procedure spUpdate, A nested INSERT, UPDATE, DELETE, or MERGE statement is not allowed in a SELECT statement that is not the immediate source of rows for an INSERT statement. Сообщение было отредактировано: 16 сен 14, 13:07 |
16 сен 14, 13:05 [16580562] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
Soldat104, в табличную переменную |
16 сен 14, 13:07 [16580577] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
Сначала outout в таблицу, из таблицы уже куда угодно. |
16 сен 14, 13:07 [16580583] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
А напрямую както можно получить без таблиц и табличных переменных? |
16 сен 14, 13:08 [16580589] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104760 |
В хелпе написано куда можно. |
||
16 сен 14, 13:09 [16580593] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
SET @id=ISNULL(SCOPE_IDENTITY(),@id);??? Правда, у tableIn не должно быть триггера INSTEAD OF INSERT. Но это и в случае OUTPUT должно выполняться. |
||
16 сен 14, 13:13 [16580606] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Вариант :) Спасибо! |
16 сен 14, 13:16 [16580626] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
А в чем прикол записывать в переменную @id значение переменной @id? O_o |
16 сен 14, 13:17 [16580632] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
И не менять @id снаружи в этом случае. |
||
16 сен 14, 13:19 [16580646] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||||
16 сен 14, 13:21 [16580657] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||||
16 сен 14, 13:32 [16580729] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47047 |
|
||||
16 сен 14, 13:37 [16580771] Ответить | Цитировать Сообщить модератору |
Гавриленко Сергей Алексеевич Member Откуда: Moscow Сообщений: 37143 |
|
||||
16 сен 14, 13:43 [16580806] Ответить | Цитировать Сообщить модератору |
a_voronin Member Откуда: Москва Сообщений: 4807 |
Можно только в одно место....о... в таблицу или табличную переменную. <OUTPUT_CLAUSE> ::= { [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ] [ OUTPUT <dml_select_list> ] } |
||
16 сен 14, 14:23 [16581073] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
iap, При вызове хранимки из приложения если в dataTable строка modifed то заводит новую в бд. И второе если в managment studia вызвать хранимку сначала на вставку строки, а потом следом правку то будет возвращать @id первой вставленной строки. Видимо без табличной переменной не обойтись public static void SaveDS(PackageDS pDS) { using (SqlConnection conn = new SqlConnection(ConnectionString)) { conn.Open(); try { using (SqlTransaction trans = conn.BeginTransaction()) { try { SqlCommand sqlUpdate = SqlHelper.CreateCommand(conn, "spUpdate", "id", "title" ); sqlUpdate .Parameters["@id"].Direction = ParameterDirection.Output; sqlUpdate .Transaction = trans; using (SqlDataAdapter dataAdapter= new SqlDataAdapter()) { dataAdapter.UpdateCommand=dataAdapter.InsertCommand=dataAdapter.DeleteCommand=sqlUpdate; dataAdapter.Update(pDS, "dTable"); } trans.Commit(); } catch (Exception ex) { trans.Rollback(); throw ex; } } } finally { conn.Close(); } } } catch (Exception e) { throw new ApplicationException(ERR_SAVEDS, e); } } create PROCEDURE [dbo].[spUpdate] @id int OUT, @title nvarchar(50)=null AS SET NOCOUNT ON; MERGE TableIN USING (SELECT @id, @title) AS source (id, title) ON (TableIN.id = source.id) WHEN MATCHED AND source.title is null THEN DELETE WHEN MATCHED THEN UPDATE SET title= source.title WHEN NOT MATCHED and source.titlePackage is not null THEN INSERT (title) VALUES (source.title); set @id=COALESCE (SCOPE_IDENTITY(),@id); |
17 сен 14, 07:13 [16583859] Ответить | Цитировать Сообщить модератору |
Soldat104 Member Откуда: Новосибирск Сообщений: 108 |
Нужно было sqlUpdate .Parameters["@id"].Direction = ParameterDirection.Output; указать как ParameterDirection.InputOutput; |
17 сен 14, 07:43 [16583896] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |