2011-09-02 62 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

相關問題