Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Двунаправленные параметры в SQL2000  [new]
Landwarrior
Member

Откуда:
Сообщений: 116
МОжно ли в хранимки передавать данные через параметры, помеченные как output? Т.е. могут ли они работать не только на выдачу рез-та, но и на прием?

CREATE PROCEDURE dbo.sp_SessionStart
(
@sAspSessionID nvarchar(64),
@nStuffID bigint output,
@nSessionID bigint output
)
AS
begin
begin tran
SET NOCOUNT ON
-- default account
if ISNULL(@nStuffID, 0) = 0
select @nStuffID = ObjectID from dbo.Stuff where UPPER(Login) = UPPER('DAEMON')
insert into dbo.[Session]
values(@sAspSessionID, GETDATE(), NULL, @nStuffID)

select @nSessionID = @@IDENTITY
commit tran
end
9 апр 04, 15:35    [621444]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
Alexes
Member

Откуда:
Сообщений: 1100
Можно
9 апр 04, 15:41    [621467]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
CREATE PROCEDURE usp_Test @Param int OUTPUT

AS
SET @Param = @Param + 2
RETURN(0)
GO

DECLARE @Param int
SET @Param = 2
EXEC usp_Test @Param OUTPUT
SELECT @Param
GO
9 апр 04, 15:42    [621470]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
Landwarrior
Member

Откуда:
Сообщений: 116
я тоже так думал. пока не напоролся на такую хрень:

Вот код хранимки:


[sql]
CREATE PROCEDURE dbo.sp_SessionStart
(
@sAspSessionID nvarchar(64),
@nStuffID bigint output,
@nSessionID bigint output
)
AS
begin
begin tran
SET NOCOUNT ON
-- default account
if ISNULL(@nStuffID, 0) = 0
select @nStuffID = ObjectID from dbo.Stuff where UPPER(Login) = UPPER('DAEMON')
-- в общем, он для него == 5
insert into dbo.[Session]
values(@sAspSessionID, GETDATE(), NULL, @nStuffID)

select @nSessionID = @@IDENTITY
commit tran
end
[/sql]


Вот C# код

[c#]
// nStuffID = чему-то осмысленному. Пусть == 1
public static Int64 SessionStart(Int64 nStuffID)
{
Int64 nRes = 0;
System.Data.SqlClient.SqlConnection sqlConnection1 = null;
System.Data.SqlClient.SqlTransaction sqt = null;

try
{
sqlConnection1 = new System.Data.SqlClient.SqlConnection();
sqlConnection1.ConnectionString = Common.ConnectionString;
sqlConnection1.Open();
sqt = sqlConnection1.BeginTransaction();

System.Data.SqlClient.SqlCommand sqlStartSession = new System.Data.SqlClient.SqlCommand("dbo.sp_SessionStart", sqlConnection1, sqt);
sqlStartSession.CommandType = CommandType.StoredProcedure;
sqlStartSession.Parameters.Add(new System.Data.SqlClient.SqlParameter("@RETURN_VALUE", System.Data.SqlDbType.Int, 4, System.Data.ParameterDirection.ReturnValue, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null));
sqlStartSession.Parameters.Add(new System.Data.SqlClient.SqlParameter("@sAspSessionID", System.Data.SqlDbType.NVarChar, 64));
sqlStartSession.Parameters.Add(new System.Data.SqlClient.SqlParameter("@nStuffID", System.Data.SqlDbType.BigInt, 8, System.Data.ParameterDirection.Output, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null));
sqlStartSession.Parameters.Add(new System.Data.SqlClient.SqlParameter("@nSessionID", System.Data.SqlDbType.BigInt, 8, System.Data.ParameterDirection.Output, false, ((System.Byte)(0)), ((System.Byte)(0)), "", System.Data.DataRowVersion.Current, null));
sqlStartSession.Parameters["@sAspSessionID"].Value = HttpContext.Current.Session.SessionID;
sqlStartSession.Parameters["@nStuffID"].Value = nStuffID;
sqlStartSession.ExecuteNonQuery();
sqt.Commit();
nRes = Convert.ToInt64(sqlStartSession.Parameters["@nSessionID"].Value);

nStuffID = Convert.ToInt64(sqlStartSession.Parameters["@nStuffID"].Value);
// какого nStuffID стал == 5 ?????

// store it in session context to make data operation easie
HttpContext.Current.Session["SessionIDNumeric"] = nRes;
}
catch(Exception ex)
{
Common.WriteErrorInfo(ex);
if (sqt != null)
sqt.Rollback();
}
finally
{
if (sqlConnection1.State == ConnectionState.Open)
sqlConnection1.Close();
}
return nRes;
}
[/c#]

Вот что лофит SQL Profiler:

declare @P1 bigint
set @P1=5
declare @P2 bigint
set @P2=10
exec dbo.sp_SessionStart @sAspSessionID = N'ra3gwu55g5p00p22a53m4ubx', @nStuffID = @P1 output, @nSessionID = @P2 output
select @P1, @P2

Что за бред??????? Какого хрена nStuffID == 5????
9 апр 04, 16:22    [621611]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
автор
Вот C# код


Можно вместо этого увидеть вызов хп серез QA, предварительно заменив

select @nSessionID = @@IDENTITY 


на

select @nSessionID = SCOPE_IDENTITY()
9 апр 04, 16:29    [621637]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
ZrenBy
Member

Откуда: Костромаа
Сообщений: 1557
>System.Data.ParameterDirection.Output

может

System.Data.ParameterDirection.InputOutput ?
9 апр 04, 16:32    [621650]     Ответить | Цитировать Сообщить модератору
 Re: Двунаправленные параметры в SQL2000  [new]
Landwarrior
Member

Откуда:
Сообщений: 116
помогло. странно, что визард не предлагает такого типа
9 апр 04, 23:27    [622198]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить