Sql server 从代码调用存储过程会导致错误

Sql server 从代码调用存储过程会导致错误,sql-server,stored-procedures,.net-core-3.0,Sql Server,Stored Procedures,.net Core 3.0,我正在尝试使用.Net Core 3.0和SQL Server 2012从代码中调用存储过程,但不断出现以下错误: SqlException:关键字“exec”附近的语法不正确。“')附近的语法不正确 我的代码: var policycontacts = await _dbContext.PolicyContacts .FromSqlInterpolated($"exec dbo.spapi_contact_getbypo

我正在尝试使用.Net Core 3.0和SQL Server 2012从代码中调用存储过程,但不断出现以下错误:

SqlException:关键字“exec”附近的语法不正确。“')附近的语法不正确

我的代码:

var policycontacts = await _dbContext.PolicyContacts
                                     .FromSqlInterpolated($"exec dbo.spapi_contact_getbypolicy {input}")
                                     .FirstOrDefaultAsync()
                                     .ConfigureAwait(false);
SQL代码:

EXEC Sp_executesql 
        N'SELECT TOP(1) [p].[ID], [p].[ActionsToTake], 
         [p].[AddedBy], [p].[BirthCountry], [p].[ContactGUID],
         [p].[ContactID], [p].[ContactStatus], [p].[DOBFormation],
         [p].[Domicile], [p].[EnhancedDueDiligence], [p].[EntityName],
         [p].[EstimatedAmountAssets], [p].[FirstName], [p].[Gender],
         [p].[HowClientMet], [p].[LastModifiedBy], [p].[LastModifiedDate],
         [p].[LastName], [p].[LastOpenDate], [p].[LastOpenedBy],
         [p].[MiddleName], [p].[Notes], [p].[OccupationBusiness],
         [p].[OnlineUser], [p].[OpeningNotes], [p].[OriginAssets],
         [p].[PEP], [p].[PEPDescription], [p].[PersonalSituation],
         [p].[RiskOverride], [p].[Sysdate] FROM (exec dbo.spapi_contact_getbypolicy @p0)AS [p]', 
              N'@p0 nvarchar(4000)', 
              @p0=N''
完全错误:

味精156,第15级,状态1,第3行
关键字“exec”附近的语法不正确

味精102,第15级,状态1,第4行
“')附近的语法不正确


没有足够的代表留下评论,所以我必须给你一个答案。对不起,我想这更像是一个评论

我有一个“好”的建议,但这可能不是最好的答案。根据存储过程的复杂程度以及是否确实要在FROM部分中调用它,请将存储过程更改为表值函数。它之所以是一个糟糕的建议,是因为使用函数存在限制和性能问题。我读了下面的文章,看看你想走哪条路

与表值函数项目交叉应用:


另一个选项可能是Sean Lange提供的选项。

您根本无法从这样的存储过程中进行选择。您需要将存储过程的输出插入到表或临时表中。然后您可以从该表中选择前1名。但是,在选择top 1时,您还需要一个order by。根据需要处理的数据量,您只需在SQLInterpolated的
之后插入一个
.asAsAsyncEnumerable()
,然后切换到LINQ to Objects,以用于查询的其余部分。这将仍然对所有结果执行存储过程,同时丢弃除第一行以外的每一行;修复这种低效率需要重写到非存储过程的内容。哦,等等,当然,这仍然是实体框架。简单地转换为可枚举的可能仍然不起作用,因为不管发生什么,它都会用goo包装查询,即使这对
EXEC
不起作用。不过,将数据模型中的存储过程映射到方法应该允许这样做——关键是存储过程结果集仍然只是一个结果集,客户机可以用与常规查询相同的方式处理它,但您确实需要一个为此而协作的ORM。