Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Куда девается выходной НД как результат выполнения ХП (MS SQL 2012) / 9 сообщений из 9, страница 1 из 1
06.01.2020, 16:44
    #39911165
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
Здравствуйте !

Есть хранимка:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
USE [TelBook]
GO
/****** Object:  StoredProcedure [dbo].[UsP_ExtraSFL]    Script Date: 06.01.2020 16:33:59 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author: Никонов Григорий
-- Create date: 20200105

-- =============================================
ALTER PROCEDURE [dbo].[UsP_ExtraSFL]

  @FieldName sysname,  -- Имя поля, по которому делать фильтрацию (where)
  @FieldValue varchar(max),  -- Значение для фильтрации
  @FieldSort sysname,  -- Имя поля для сортировки (order by)
  @Nlist int,          -- Номер листа, который требуется вернуть
  @QRows int           -- Кол-во строк на листе 

AS

BEGIN

   DECLARE  @SSQL varchar(max)
   SET @SSQL = ' SELECT FIO_ID, FIO_FAM, FIO_Name, FIO_SName, RG_ShName, dbo.UsF_WorkPlace(Dep_SName,RG_ShName,UPR_ShName,SubUPR_ShName) as WorkPlace,
                POS_Name, VTel, CTel, MTel_No, Recept FROM UsF_ExtraAllFio () '
   +' WHERE '+@FieldName+ ' = '''+@FieldValue+''' ORDER BY '+@FieldSort
   +' OFFSET '+ cast((@Nlist-1)*@QRows as varchar(10))+'ROWS FETCH NEXT '+cast(@Qrows as varchar(10))+' ROWS ONLY '
   EXEC (@SSQL)

END



Она прекрасно работает.
Пытаюсь сунуть ее в модель EDM. Класса при этом не создается, в контексте есть функция, которая почему-то возвращает int.
Посмотрел хранимку на SQL Server и увидел, что возвращает она целое число, т.е. Int.
Подскажите пожалуйста, где кривизна
...
Рейтинг: 0 / 0
06.01.2020, 20:00
    #39911208
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
MsGuns
Посмотрел хранимку на SQL Server и увидел, что возвращает она целое число, т.е. Int.
Подскажите пожалуйста, где кривизна
Все хранимые процедуры в сиквеле всегда возвращают значение типа int.
MsGuns
Пытаюсь сунуть ее в модель EDM. Класса при этом не создается, в контексте есть функция, которая почему-то возвращает int.
Это уже вопрос не по сиквелу, а по вашему EDM (что это? и как туда что то "суют"?)
...
Рейтинг: 0 / 0
06.01.2020, 20:41
    #39911219
felix_ff
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
alexeyvg,

EDM это Entity Data Model.
ТС использует этот фреймворк для доступа к данным SQL в виде объектной модели.

Могу ошибаться но вроде EDM использует системные хранимки для получения метаданных результирующих наборов хранимой процедуры. что то типа sp_describe_first_result_set / sp_stored_procedures

MSGuns вы можете посмотреть в трассировке какой запрос прилетает на сервер от вашей модели. скорее всего не получается определить точные метаданные результирующего набора поскольку у вас в хранимке используется динамический sql.

add: можете сделать процедуру обертку которая будет дергать вашу динамику с директивой with result set
...
Рейтинг: 0 / 0
06.01.2020, 23:59
    #39911257
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
felix_ff, Вы не ошибаетесь :)

Переделал хранимку на явный Select из там же создаваемой временной таблицы, куда предварительно инсертится дмнамический SQL. Все заработало.
Но мне вообще не очень нравится идея использования временных таблиц без крайней необходимости. Здесь же никакой алгоритмики кроме "хитрого" селекта нет.

Мысль с with result set показалась мне интересной. Надо поисследовать :)

Спасибо за помощь.
...
Рейтинг: 0 / 0
07.01.2020, 00:17
    #39911259
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
Посмотрел. Увы, не выход с with result set и вот почему.

Это именно "обертка" над хранимкой. И мне надо писать ее собственно в модели (например, в репозитории). Точно также "ручками" добавлять соответствующий класс. Т.е. практически все делать руками. Тогда возникает вопрос: а зачем собственно мне EDM если все приходится писать руками ? Однако ответ не так прост - в модели EDM используется куча корректно отмапированнх таблиц, вьюх и UDF с SP. Проект прекрасно с ними взаимодействует, написано несколько типизированных представлений и методов контроллера, где привязка к модели работает как часы (как прямая - от контроллера в представлению, так и обратная - от клиента в контроллер). Т.е. полный отказ от EDM приведет к ПОЛНОЙ замене кода модели на ручной. Прелести ORM EDM как не бывало !

В общем, как я понял, нужно подстраивать серверный код (имеется в виду БЛ SQL-Server) под "особенности" мелкомягкого EDM хотя бы для того, чтобы обходить его глюки :)
...
Рейтинг: 0 / 0
07.01.2020, 11:26
    #39911315
aleks222
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
MsGuns
З
Пытаюсь сунуть ее в модель EDM. Класса при этом не создается, в контексте есть функция, которая почему-то возвращает int.
Посмотрел хранимку на SQL Server и увидел, что возвращает она целое число, т.е. Int.
Подскажите пожалуйста, где кривизна


Дык, вашЪ динамический sql неочевиден для способов получения метаданных о возвращаемом рекордсете.

Сговонотяпьте костыль

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
ALTER PROCEDURE [dbo].[UsP_ExtraSFL]

  @FieldName sysname,  -- Имя поля, по которому делать фильтрацию (where)
  @FieldValue varchar(max),  -- Значение для фильтрации
  @FieldSort sysname,  -- Имя поля для сортировки (order by)
  @Nlist int,          -- Номер листа, который требуется вернуть
  @QRows int           -- Кол-во строк на листе 

AS

BEGIN

   DECLARE  @SSQL varchar(max)
   SET @SSQL = ' SELECT FIO_ID, FIO_FAM, FIO_Name, FIO_SName, RG_ShName, dbo.UsF_WorkPlace(Dep_SName,RG_ShName,UPR_ShName,SubUPR_ShName) as WorkPlace,
                POS_Name, VTel, CTel, MTel_No, Recept FROM UsF_ExtraAllFio () '
   +' WHERE '+@FieldName+ ' = '''+@FieldValue+''' ORDER BY '+@FieldSort
   +' OFFSET '+ cast((@Nlist-1)*@QRows as varchar(10))+'ROWS FETCH NEXT '+cast(@Qrows as varchar(10))+' ROWS ONLY '
--   EXEC (@SSQL)


SELECT top(1) FIO_ID, FIO_FAM, FIO_Name, FIO_SName, RG_ShName, dbo.UsF_WorkPlace(Dep_SName,RG_ShName,UPR_ShName,SubUPR_ShName) as WorkPlace,
                POS_Name, VTel, CTel, MTel_No, Recept FROM UsF_ExtraAllFio ();

END



скормите его EDM.

Опосля чего верните взад исходный код процедуры.
...
Рейтинг: 0 / 0
07.01.2020, 12:00
    #39911317
invm
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
MsGuns
Переделал хранимку на явный Select из там же создаваемой временной таблицы, куда предварительно инсертится дмнамический SQL.
И это дает ровно такой же эффект, только с дополнительными приседаниями, как и exec (...) with result sets (...)
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
use tempdb;
go

create procedure dbo.p1
as
begin
 set nocount on;
 declare @s nvarchar(max) = N'select object_id, name from sys.objects';

 declare @result table (object_id int, name sysname);
 
 insert into @result
  (object_id, name)
  exec(@s);

 select object_id, name from @result;
end;
go

create procedure dbo.p2
as
begin
 set nocount on;
 declare @s nvarchar(max) = N'select object_id, name from sys.objects';

 exec(@s) with result sets ((object_id int, name sysname));
end;
go

exec sys.sp_describe_first_result_set N'exec dbo.p1';
exec sys.sp_describe_first_result_set N'exec dbo.p2';
go

drop procedure dbo.p1, dbo.p2;
go
...
Рейтинг: 0 / 0
07.01.2020, 17:50
    #39911414
MsGuns
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
invm, Спасибо.
Принял к сведению. Заменил в ХП временную таблицу на таблицу-параметр.
...
Рейтинг: 0 / 0
07.01.2020, 19:39
    #39911424
Gerros
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
MsGuns,
если я правильно понял комментарий от invm, он советует вставить with result sets внутрь вашей хранимки.
тогда вам не понадобится ни #временная таблица, ни @таблица-переменная.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Куда девается выходной НД как результат выполнения ХП (MS SQL 2012) / 9 сообщений из 9, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]