用户定义的表变量的存储过程结果不是由SqlDataReader读取的

时间:2015-06-05 16:05:27

标签: sql-server tsql ado.net

我有以下t-sql存储过程:

CREATE PROCEDURE myProcedure

DECLARE @retTab myTab;

MERGE
...
OUTPUT carrierId INTO @retTab;

SELECT * FROM @retTab;

其中myTab是用户定义的表类型,如下所示:

CREATE TYPE myTab AS TABLE (
    carrierId INT       
);

当我直接在Management Studio中执行该过程时,我得到了数据结果集;但是当我使用ADO.NET执行它时,如下所示:

using (var cmd = new SqlCommand("spMergeCoverage", con))
{
     cmd.CommandType = CommandType.StoredProcedure;
     ...
     using (SqlDataReader r = cmd.ExecuteReader())
     {      
         while (r.Read())
         {
             var id = (int)r["carrierId"];
         ...

我的SqlDataReader获得一个空结果集。此外,当我将merge输出插入真实表格而不是@retTab时,我的读者会得到结果。为什么会发生这种情况?如何解决这个问题?

1 个答案:

答案 0 :(得分:-1)

如果存储过程中存在其他DML操作(如合并/输出语句),并且NOCOUNT设置为off,则每个DML操作都会将结果集发送回调用者,即使它只是&# 34; X记录受影响",它将在sqldatareader中显示为空结果集。试试

SET NOCOUNT ON;

在proc的顶部,然后在最后将其重新设置为off,看看你是否得到了预期的结果。