Entity Framework не может обработать простую переменную таблицы? - PullRequest
13 голосов
/ 13 мая 2011
  • Последняя строка в хранимой процедуре: select * from @t
  • Обновлена ​​модель и найдена хранимая процедура
  • Попытка импортировать новую функцию с помощью мастера, и он сказал нетстолбцы могут быть найдены.

Серьезно?Кто-то сказал мне, что это ложь.

create procedure WorkIt
as
set nocount on

create table #pivot
(
    Name varchar(30),
    Value decimal,
    Grade varchar(2)
)

insert into #pivot
select 'Repeating Pct', 1, 'K'
union all
select 'Repeating Pct', 2, '1'
union all
select 'Repeating Pct', 3, '2'
union all
select 'Repeating Pct', 4, '3'
union all
select 'Repeating Pct', 5, '4'
union all
select 'Repeating Pct', 6, '5'
union all
select 'Repeating Pct', 7, '6'  
union all
select 'Repeating Pct', 8, '7'
union all
select 'Repeating Pct', 9, '8'
union all
select 'Repeating Pct', 10, '9'
union all
select 'Repeating Pct', 11, '10'
union all
select 'Repeating Pct', 12, '11'
union all
select 'Repeating Pct', 13, '12'
declare @t table
(
    name varchar(30),
    K decimal (15,5) ,
    [1] decimal (15,5),
    [10] decimal (15,5),
    [11] decimal (15,5),
    [12] decimal (15,5),
    [2] decimal (15,5),
    [3] decimal (15,5),
    [4] decimal (15,5),
    [5] decimal (15,5),
    [6] decimal (15,5),
    [7] decimal (15,5),
    [8] decimal (15,5),
    [9] decimal (15,5)
)
insert into @t
exec dbo.CrossTabWithoutSumWithOrderBy #pivot, 'Name', null, 'Grade', 'Value', 
    -- sort repeating pct to bottom
    'case name when ''Repeating Pct'' then 999 else 0 end'

drop table #pivot
select * from @t

Результат

name    K   1   10  11  12  2   3   4   5   6   7   8   9
Repeating Pct   2.00000 11.00000    12.00000    13.00000    3.00000 4.00000 5.00000 6.00000 7.00000 8.00000 9.00000 10.00000    1.00000

Ответы [ 2 ]

26 голосов
/ 14 мая 2011

Когда платформа сущностей пытается извлечь столбцы из хранимой процедуры, она вызывает SET FMTONLY ON и после этого выполняет хранимую процедуру. Когда FMTONLY равно ON, выполнение возвращает только метаданные, и оно не работает с какой-то сложной конструкцией в хранимых процедурах - например, динамический SQL, временные таблицы, а также переменные таблиц.

У вас есть три варианта:

  • Как описано в другой ответ добавить SET FMTONLY OFF в начале вашей хранимой процедуры. Это заставит вашу хранимую процедуру действительно выполняться, поэтому убедитесь, что она только читает данные - любая вставка, обновление или удаление будут выполняться каждый раз, когда вы пытаетесь получить столбцы!
  • Определение сложного типа вручную
  • Измените вашу хранимую процедуру, чтобы не использовать ни одну из этих функций
0 голосов
/ 08 июня 2018

У меня была похожая проблема с edmx (в моем случае это было утверждение if else), был обходной путь.Перед обновлением edmx: объявите некоторые переменные вашего типа возврата, выберите их.Обновите модель, затем измените вашу хранимую процедуру с вашим настоящим кодомТо есть: объявить объявить @name varchar (30), @K десятичный (15,5), @ x1 десятичный (15,5), @ x10 десятичный (15,5), @ x11 десятичный (15,5), @ x12 десятичный(15,5), @ x2 десятичный (15,5), @ x3 десятичный (15,5), @ x4 десятичный (15,5), @ x5 десятичный (15,5), @ x6 десятичный (15,5), @ x7 десятичное (15,5), @ x8 десятичное (15,5), @ x9 десятичное (15,5)

Выберите @name, @k, @ x1, @ x10, @ x11, @x12, @ x2, @ x3, @ x4, @ x5, @ x6, @ x7, @ x8, @ x9

Конечно, вы должны оставить этот фиктивный код в своей хранимой процедуре и оставить комментарий вЭто.так что когда кто-нибудь обновляет его с помощью edmx, раскомментируйте этот фиктивный код и закомментируйте реальный код.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...