我有一个带签名的T-SQL存储过程
CREATE PROCEDURE MyProc
@recordCount INT OUTPUT
@param1 INT
...
在Sql Server中直接执行时,该过程在5秒内运行,返回一些总计约100行的结果集.
调用使用ADO.NET此过程SqlDataAdapter.Fill方法来填充Dataset导致SqlTimeoutException在SqlCommand3分钟后(指定的超时间隔).
更改存储过程以使其不再具有输出参数,并且所需的输出值作为最后的结果集返回,解决了问题,并且整个过程在预期的5秒内运行.
但为什么?
我不想通过我的代码库来修改这种行为的所有实例,而不理解我是否真的解决了这个问题.
另一件需要注意的是,这只在一个特定的服务器上显而易见,它确实拥有比我们运行的其他类似数据库更大的数据集.肯定不是Sql Server设置?
UPDATE
进入框架源,问题似乎出现在元数据检索中.对象的ConsumeMetaData方法SqlDataReader无限期挂起.但是我在其他数据库上运行测试并且无法重现,因此当通过ADO.NET调用此过程时,这是一个特定于数据库的问题...很棒.
更新II
已确认如果我将代码更改为使用OleDbDataAdapterSQLOLEDB或SQLNCLI提供程序类型,则问题仍然存在.绝对与连接有关.
我有一个包含大量复杂存储过程的现有数据库,我想通过EF 4使用这些过程.我已经完成了以下操作:
Customer.MyFunction,复杂类型.结果代码:
CustomerEntities entity = new CustomerEntities();
var result = entity.MyFunction("XYZ", ref o_MyString);
现在我的存储过程有一个输出参数,我以前用它来调用(在WebForm中).但我收到以下错误:
无法从'ref string'转换为'System.Data.Objects.ObjectParameter'
请帮忙
编辑
当我试图保存时,我收到以下错误
映射函数绑定指定具有不受支持的参数的函数Model.Store.P_GetCustomer:o_MyString.输出参数只能通过RowsAffectedParameter属性进行映射.使用结果绑定从函数调用返回值.
我正在寻找除了通常的"out参数令人困惑并且指示方法做的不仅仅是一件事"式的参数以及更多关于WCF服务中输出参数特别糟糕的原因.我现在在哪里工作,我们在WCF服务中有一条规则反对他们,我正在努力找出原因!
我用以下格式编写了一个存储过程:
ALTER PROCEDURE usp_data_migration 
   (@sourceDatabase varchar(50),
    @sourceTable varchar(50),
    @targetDatabase varchar(50),
    @targetTable varchar(50),
    @finaloutput varchar(max) output)
AS
BEGIN
----Set of SQL Blocks
END
然后,我正在执行程序:
DECLARE @finaloutput1 varchar(300)
EXEC usp_data_migration 'Yousuf', 'emp', '[City Branch]', 'emp_tgt', @finaloutput1 output 
SELECT @finaloutput1 
通过这种方式执行我没有正确的输出.
当我执行这种方式时:
DECLARE @finaloutput1 varchar(300)
EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase = '[City Branch]',
                        @targetTable = 'emp_tgt',
                        @finaloutput1 output 
SELECT @finaloutput1 
我收到一条错误消息:
消息119,级别15,状态1,行41
必须将参数编号5和后续参数作为"@name = value"传递.在使用"@name = value"形式之后,必须以"@name = value"形式传递所有后续参数.
如果我删除了输出参数并执行了该过程,我得到了我想要的输出但是我无法将结果作为输出.
EXEC usp_data_migration @sourceDatabase = 'Yousuf',
                        @sourceTable = 'emp',
                        @targetDatabase …请考虑以下T-SQL代码段:
CREATE PROC dbo.SquareNum(@i INT OUTPUT)
AS
BEGIN
    SET @i = @i * @i
    --SELECT @i
END
GO
DECLARE @a INT = 3, @b INT = 5
EXEC dbo.SquareNum @a OUTPUT
EXEC dbo.SquareNum @b
SELECT @a AS ASQUARE, @b AS BSQUARE
GO
DROP PROC dbo.SquareNum
结果集是:
ASQUARE     BSQUARE
----------- -----------
9           5
可以看出,@b不是平方,b/c它没有作为输出参数传入(OUTPUT传入参数时没有限定符).
我想知道是否有一种方法可以检查存储过程体(在本例中为dbo.SquareNum体),以查看参数是否确实已作为OUTPUT参数传入?
在System.Runtime.InteropServices该<Out()>属性存在.但这是为了什么?如果您可以使用以下示例作为答案的基础,我将很高兴.
 Shared Sub Add(ByVal x As Integer, ByVal y As Integer, <Out()> ByRef Result As Integer)
  Result = x + y
 End Sub
我对这个问题有点困难,因为我不确定如何在SQL Server中执行此操作.
基本上,我想在数据库中插入一个新行,获取刚刚插入的PK值(相同的查询)并将其输出回任何称为存储过程的行:
CREATE PROCEDURE Users_Insert
    -- Add the parameters for the stored procedure here
    @userid int output,
    @name varchar(50),
    @surname varchar(50),
    @email varchar(200),
    @password varchar(50),
    @location varchar(50)
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;
    -- Insert statements for procedure here
    insert into Users(FirstName, LastName, Email, Password, Location)
    values(@name, @surname, @email, @password, @location);
    GO
    @userid = @@IDENTITY;
END
我在MySQL中完成了以下操作:
CREATE PROCEDURE Users_Insert(@userid int output, @name varchar(50), …我正在使用输出参数从存储过程返回值.
存储过程中的声明是: @GrandTtl DECIMAL(19,3) OUT
该SELECT查询:
SET @GrandTtl = (SELECT TOP 1 Bill_Amount 
                 FROM Tbl_Restaurant_Kitchen_Order_Bill_Details 
                 WHERE Bill_Number = @billno)
例如,select查询返回值,4087.67然后4088从SQL Server到C#返回输出参数值.
这是调用存储过程的C#代码:
SqlCommand cmd = new SqlCommand("Sp_RestCC_BillDetails", con);
cmd.CommandType = CommandType.StoredProcedure;
SqlParameter OutParam26 = cmd.Parameters.Add("@GrandTtl", SqlDbType.Decimal,19);
da = new SqlDataAdapter(cmd);
con.Open();
da.Fill(ds, "dtRestCC_Items");
con.Close();
objRCCBEL.GrandTtlOut = Convert.ToDecimal(cmd.Parameters["@GrandTtl"].Value);
c# sql-server stored-procedures output-parameter sql-server-2008
我正在使用一个有两列的表,customer_id和customer_name.
customer_name是一个简单的varchar,customer_id是一个自动递增的主键.
我想用我的C#应用程序插入一个customer_name,并检索它的值customer_id.
只需插入就可以通过使用来解决
using (SqlConnection connection = new SqlConnection(AppConstants.ConnectionString))
{
    using (SqlCommand command = new SqlCommand("INSERT INTO custom_customer (customer_name) VALUES (@name);"))
    {
        command.Parameters.Add(new SqlParameter("name", customer));
        connection.Open();
        command.ExecuteNonQuery();
        connection.Close();
    }
}
我找到了该OUTPUT语句的一些文档,可用于检索值.
我认为正确的语法是
INSERT INTO custom_customer (customer_name) 
OUTPUT Inserted.customer_id 
VALUES (@name);
我认为我需要使用
command.ExecuteReader();
但后来我被卡住了.我该如何从查询中获取值?
我试图从MySQL存储过程中获取输出参数,让我们看一下下面的例子:
1在mysql中我创建了这个过程并且它有效.
CREATE PROCEDURE sp_name (out id int)
Begin
    select id into @id from table order by id desc limit 1;
End
mysql> call sp_deduct_credit_and_money(@id);
Query OK, 0 rows affected (0.01 sec)
mysql> select @id;
+--------------+
|          @id |
+--------------+
|           24 |
+--------------+
1 row in set (0.00 sec)
2因此,它也适用于Rails,但它不会为我返回任何值:
ActiveRecord::Base.connection.execute("call sp_name(@id)")
ActiveRecord::Base.connection.execute("select @id")
这是Rails中的日志
(2.0ms)  call sp_name(@id)
(0.1ms)  select @id
我的问题是如何获得输出参数的返回值@id?
output-parameter ×10
sql-server ×6
c# ×3
t-sql ×3
.net ×2
ado.net ×2
sql ×2
attributes ×1
mysql ×1
output ×1
timeout ×1
vb.net ×1
wcf ×1