entity framework无法处理简单的表变量?

  • 存储过程的最后一行: select * from @t
  • 更新了模型并找到了存储过程
  • 试图使用向导导入一个新function,它说没有找到任何列。

真的吗? 有人告诉我它的谎言。

 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 

当entity framework尝试从存储过程中检索列时,它会调用SET FMTONLY ON ,然后执行存储过程。 当FMTONLYON执行仅返回元数据,并且它不适用于存储过程中的某些高级构造 – 例如动态SQL,临时表以及表变量。

你有三个选择:

  • 如另一个答案中所述,在存储过程开始时添加SET FMTONLY OFF 。 这将导致您的存储过程真正执行,因此请确保它只读取数据 – 每次尝试检索列时都会执行任何插入,更新或删除!
  • 手动定义复杂类型
  • 修改存储过程以不使用任何此function

我有一个与edmx类似的问题(在我的情况下是if else声明),有一个解决方法。 在更新edmx之前:声明返回类型的一些变量,选择它们。 更新模型,然后使用您的实际代码修改存储过程。 即:声明声明@name varchar(30),@ K decimal(15,5),@ x1 decimal(15,5),@ x10 decimal(15,5),@ x11 decimal(15,5),@ x12 decimal (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更新它时,应该取消注释这个虚拟代码并注释真实代码。