繁体   English   中英

使用Datatable作为参数的存储过程不返回任何内容

[英]Stored Procedure with Datatable as param returns nothing

我已经建立了一个存储过程,该过程将数据表传递到实体框架中并直接从中调用。

我用以下sql创建了一个Type:

 CREATE TYPE Regions AS TABLE 
             (      RegionId int, 
                    Region varchar(max),                    
                    BodyId int NULL, 
                    Body varchar(max),
                    AreaId int NULL, 
                    Area varchar(max),   
                    Location varchar(max), 
                    LocationId int
              )

我的测试存储过程如下:

CREATE PROCEDURE [dbo].[GetStats]

     @regions  dbo.Regions READONLY 

AS
BEGIN

    SELECT * INTO #tmptble  from @regions  

    Select * from #tmptble


END

我正在使用以下方法来调用存储过程:

 SqlParameter param = new SqlParameter();

            param.SqlDbType = SqlDbType.Structured;
            param.TypeName = "dbo.Regions";
            param.Value = myDataTable;
            param.ParameterName = "@regions";

return _context.Database.SqlQuery<RegionDetails>("GetStats", param);

我的数据表绝对是正确的格式,因为我已经通过探查器将其传递到存储过程中,并且可以看到所有插入物出现了。 如果我从所有插入语句生成测试表,则该过程可以正常运行,但是当我使用传入的数据表运行该表时,它仅不返回任何行。

编辑-有关更多信息,当我通过探查器运行此程序时,将得到以下信息:

declare @p3 dbo.Regions

~~~a Load of insert statements of all my datatable data~~~

exec sp_executesql N'GetStats',N'@regions [dbo].[Regions] READONLY',@regions =@p3

上面的更新我一直在分析探查器中显示的内容,如果我替换

exec sp_executesql N'GetStats',N'@ regions [dbo]。[地区] READONLY',@ regions = @ p3

EXEC GetStats @ p3

再次有效。 有人知道为什么吗?

试试这个方法:

//create parameter
var param = new SqlParameter("@regions", SqlDbType.Structured);   
param.Value = myDataTable;   
param.TypeName = "dbo.Regions";  

//return result set
return _context.ExecuteFunction<RegionDetails>("dbo.Regions", param);

//OR
//execute stored procedure for inserts, returns rows effective
return _context.Database.ExecuteSqlCommand("exec dbo.Regions @regions", param);

答案基于@SteveD的答案,但要弄清楚我所做的一切,以防其他人帮忙。 我的存储过程没有任何问题。 纯粹是我的要求。 它需要在实际调用中使用参数名称,如下所示:

SqlParameter param = new SqlParameter();

            param.SqlDbType = SqlDbType.Structured;
            param.TypeName = "dbo.Regions";
            param.Value = myDataTable;
            param.ParameterName = "@regions";

return _context.Database.SqlQuery<RegionDetails>("GetStats @regions", param);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM