我有以下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
时,我的读者会得到结果。为什么会发生这种情况?如何解决这个问题?
答案 0 :(得分:-1)
如果存储过程中存在其他DML操作(如合并/输出语句),并且NOCOUNT设置为off,则每个DML操作都会将结果集发送回调用者,即使它只是&# 34; X记录受影响",它将在sqldatareader中显示为空结果集。试试
SET NOCOUNT ON;
在proc的顶部,然后在最后将其重新设置为off,看看你是否得到了预期的结果。