Вызов хранимой процедуры из кода вызывает ошибку - PullRequest
0 голосов
/ 16 октября 2019

Я пытаюсь вызвать хранимую процедуру из кода, используя .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
Неверный синтаксис рядом с ')'

1 Ответ

0 голосов
/ 16 октября 2019

Недостаточно представителей, чтобы оставить комментарий, поэтому я должен оставить вам ответ. Извините, я думаю, что это больше комментарий.

У меня есть "нормальная" рекомендация, но это может быть не самый лучший ответ. В зависимости от того, насколько сложна ваша хранимая процедура, и если вы действительно хотите вызвать ее в разделе FROM, измените вашу хранимую процедуру на табличную функцию. Причина, по которой это ужасная рекомендация, заключается в наличии ограничений и проблем с производительностью при использовании функции. Я прочел следующие статьи и посмотрел, по какому маршруту вы хотели бы пойти.

Функция с табличными значениями убивает производительность моего запроса

https://blogs.msdn.microsoft.com/psssql/2010/10/28/query-performance-and-multi-statement-table-valued-functions/

Перекрестное применение с табличным функциональным артикулом: https://www.sqlshack.com/the-difference-between-cross-apply-and-outer-apply-in-sql-server/

Другим вариантом может быть тот, который предоставил Шон Ланге.

...