在SQL 2005上,我有一个简单的SP,它从表中选择行。 SP不使用临时表或返回多个结果集。在VS2010中,我将SP从Server Explorer拖到DBML设计器,SP被添加到LINQ数据上下文中。一切正常。如果我然后将表和SP脚本编写到另一个实时SQL 2005服务器上,我收到错误“无法检测到以下存储过程的返回类型..”就像我说的,没有临时表或多个结果集通常会产生这个错误。服务器上是否还有其他原因造成这种情况?
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE PROCEDURE [dbo].[spUsers]
AS
BEGIN
SET NOCOUNT ON;
SELECT top 100 * from Users
END
答案 0 :(得分:2)
确保您拥有:
SET NOCOUNT ON;
作为“BEGIN”声明后SP中的第一行。
如果您的SP没有此功能,则会返回
等消息'10 Rows affected...'
Linq试图将其解释为功能结果的一部分。我曾经咬过它很多次!!
答案 1 :(得分:0)
这是Linq to SQL的一个已知问题,令人沮丧。它似乎有点不可预测。我可靠地解决这个问题的唯一方法就是当我需要它来返回结果集时,不要让L2S调用存储过程。我让它调用一个表值UDF。 L2S似乎对这些没有任何问题,我从未遇到过使用它们的任何问题。
答案 2 :(得分:0)
好吧,它在实时服务器上失败的原因是与访问DBMS上的元数据所需的特权有关。这些是从SP创建返回值数据类型所必需的。通过提升SQL用户帐户,然后将SP拖到DBML设计器上。宾果..它可以工作!
答案 3 :(得分:-1)
使用
创建程序Getxxxxxxx
@xxxxx uniqueidentifier ,@ xxxxx uniqueidentifier
设置fmtonly off //你查询
上设置fmtonly