Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Данные из Output в переменную  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Soldat104,

в табличную переменную
16 сен 14, 13:07    [16580577]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сначала outout в таблицу, из таблицы уже куда угодно.
16 сен 14, 13:07    [16580583]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
А напрямую както можно получить без таблиц и табличных переменных?
16 сен 14, 13:08    [16580589]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Glory
Member

Откуда:
Сообщений: 104751
Soldat104
А напрямую както можно получить без таблиц и табличных переменных?

В хелпе написано куда можно.
16 сен 14, 13:09    [16580593]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Soldat104
А напрямую както можно получить без таблиц и табличных переменных?
SET @id=ISNULL(SCOPE_IDENTITY(),@id);
???

Правда, у tableIn не должно быть триггера INSTEAD OF INSERT.
Но это и в случае OUTPUT должно выполняться.
16 сен 14, 13:13    [16580606]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
Вариант :) Спасибо!
16 сен 14, 13:16    [16580626]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
А в чем прикол записывать в переменную @id значение переменной @id? O_o
16 сен 14, 13:17    [16580632]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Гавриленко Сергей Алексеевич
А в чем прикол записывать в переменную @id значение переменной @id? O_o
Чтобы показать, что не было вставки, например.
И не менять @id снаружи в этом случае.
16 сен 14, 13:19    [16580646]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
iap
Гавриленко Сергей Алексеевич
А в чем прикол записывать в переменную @id значение переменной @id? O_o
Чтобы показать, что не было вставки, например.
И не менять @id снаружи в этом случае.
Это ж не переменная, а параметр OUTPUT всё-таки.
16 сен 14, 13:21    [16580657]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
iap
пропущено...
Чтобы показать, что не было вставки, например.
И не менять @id снаружи в этом случае.
Это ж не переменная, а параметр OUTPUT всё-таки.
Будет или вставка, или апдейт, и в любом случае автор хочет получить id записи, который он и так знает. Пример бессмысленный.
16 сен 14, 13:32    [16580729]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
iap
Member

Откуда: Москва
Сообщений: 47198
Гавриленко Сергей Алексеевич
iap
пропущено...
Это ж не переменная, а параметр OUTPUT всё-таки.
Будет или вставка, или апдейт, и в любом случае автор хочет получить id записи, который он и так знает. Пример бессмысленный.
В случае вставки как узнать снаружи что вставилось?
16 сен 14, 13:37    [16580771]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
iap
Гавриленко Сергей Алексеевич
пропущено...
Будет или вставка, или апдейт, и в любом случае автор хочет получить id записи, который он и так знает. Пример бессмысленный.
В случае вставки как узнать снаружи что вставилось?
А, ну да. Там identity, я не заметил.
16 сен 14, 13:43    [16580806]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4974
Glory
В хелпе написано куда можно.


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

<OUTPUT_CLAUSE> ::=
{
    [ OUTPUT <dml_select_list> INTO { @table_variable | output_table } [ ( column_list ) ] ]
    [ OUTPUT <dml_select_list> ]
}
16 сен 14, 14:23    [16581073]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
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]     Ответить | Цитировать Сообщить модератору
 Re: Данные из Output в переменную  [new]
Soldat104
Member

Откуда: Новосибирск
Сообщений: 108
Нужно было sqlUpdate .Parameters["@id"].Direction = ParameterDirection.Output; указать как ParameterDirection.InputOutput;
17 сен 14, 07:43    [16583896]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить