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

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

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

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

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

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

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

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

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

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

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

В общем, как я понял, нужно подстраивать серверный код (имеется в виду БЛ SQL-Server) под "особенности" мелкомягкого EDM хотя бы для того, чтобы обходить его глюки :)
...
Рейтинг: 0 / 0
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
    #39911315
aleks222
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
    #39911317
invm
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
    #39911414
MsGuns
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
invm, Спасибо.
Принял к сведению. Заменил в ХП временную таблицу на таблицу-параметр.
...
Рейтинг: 0 / 0
Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
    #39911424
Gerros
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MsGuns,
если я правильно понял комментарий от invm, он советует вставить with result sets внутрь вашей хранимки.
тогда вам не понадобится ни #временная таблица, ни @таблица-переменная.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Куда девается выходной НД как результат выполнения ХП (MS SQL 2012)
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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