2011-09-02 109 views
0

我正尝试使用LINQ连接到SQL存储过程。它适用于具有静态SQL查询的存储过程。LINQ to SQL调用使用动态SQL的存储过程

我想连接到具有动态SQL的存储过程。

在存储过程结束时,它有一个exec语句。

exec(@srchQuery) 

当我这样做时,它不起作用,因为它是动态SQL。

如果我使用print @srchQuery并复制该存储过程,并在存储过程中使用该静态SQL,它可以正常工作。

回答

2

LINQ to SQL分析直接SELECT语句,以查看执行所述SQL存储过程后必须投影的模型类型。由于您使用的动态语句使用EXEC,因此无法确定要生成的模型类型。

简单的答案是要么不使用存储过程,而要使用LINQ to SQL来生成SQL,或者不要在存储过程中使用动态构建语句。

您正在生成SQL语句的事实意味着您有一个强大的用例,因为它可以在没有存储过程的情况下实现您想要的功能。总是喜欢简单...问自己,你是否需要使用动态构建语句之内的存储过程?

+0

简单是一件好事,但我需要一个存储过程中使用动态生成的语句。我可以在T-SQL中使用表变量。但是,我在这个领域不太熟悉。有没有人使用表变量,使其工作或知道可能工作的逻辑? – slamsal

+0

@Bfree回答工作。没有真正简单的方法来做到这一点。我过去也遇到过同样的问题。我认为问题在于Linq to Sql无法“计算出”在执行时建立SELECT语句后将返回哪种类型。我做了什么来解决这个问题,是在存储过程中,我只做了一个选择并选择了我可能需要的所有列。然后,我让Linq给Sql生成基于此的函数。然后,我又回到了SQL,并将存储的proc改回了原来的样子。这里的技巧不是重新生成DBML。 – slamsal

0

只需直接调用存储过程的DataContext的范围内:

using (YourDataContext dc = new YourDataContext()) 
{ 
    ... 
    dc.ExecuteCommand("EXEC MyStoredProcedure"); 
    ... 
} 
+0

这仍然会映射为linq结果集吗? – slamsal