1

我有一個像myStoreProcedure凡在存儲過程中

@personId VARCHAR(MAX) 

SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name 
FROM   Person 
WHERE CAST(Person.PersonId AS varchar(max)) in (@personId) 

我想通過WHERE IN列出基於PersonId所有的人,但數據類型是varchar。到目前爲止,這是我嘗試過的。

var p0 = p.Select(x => new { id = "'" + x.ToString() + "'" }) 
    .Select(c => c.id).ToArray();  

string personIds1 = string.Join(",", p0); 

讓說,我有2, 5 PERSONID的,所以通過與上述結果的代碼加入Id

personIds1 = '2', '5'

現在,當我用參數調用myStoreProcedure時,我沒有任何結果。

var list = myEntities.myStoreProcedure(personIds1).Select(t => new PersonEntity 
     { 
      IdNo = t.IdNo, 
      Name = t.Name, 
     }).ToList(); 

我的問題是:

如何創建一個存儲過程來讀取varchar就像例如:

[email protected] = "'2', '5'" <-just an example 
WHERE CAST(Person.PersonId AS varchar(max)) in (@personId) 

這樣我就可以得到PersonId 2,5等。

+0

PersonID是一個varchar字段還是一個數字字段? – Steve 2013-03-25 21:14:31

+0

是一個Int數據類型,這是我的'Person'表的主鍵,我試圖將其轉換爲Varchar,以便我可以使用'Where In'。這是我的[參考](http://www.techonthenet.com/sql/in.php) – spajce 2013-03-25 21:18:15

+0

我也可以建議你避免這種方式。您可以嘗試@rsenna sution,或者在選擇之前嘗試填充臨時表 - 在相同的連接/事務中。 – evgenyl 2013-03-25 22:06:50

回答

3

可以將值列表傳遞給存儲過程......你不能像你這樣做!

不可能聲明一個「宏」參數。參數必須綁定到單個對象;它不能用於生成SQL語句。這正是你想要做的:你試圖將整個IN子句傳遞給存儲過程,這是不允許的。

(當然,也許能做到這一點,通過使用動態執行,但請不要嘗試在生產數據庫,性能將是可怕的...: - /)

如果我有做同樣的事情,我會用一個table-valued parameter

CREATE TYPE [dbo].[IdTable] AS TABLE(
    [Id] [int] NULL 
) 
GO 

CREATE PROCEDURE [dbo].[sp_get_peoplez] (
    @ids IdTable READONLY 
) AS 
BEGIN 
    SELECT IdNo, LastName + ', ' + FirstName + ' ' + MiddleName AS Name 
    FROM Person 
    WHERE Person.PersonId IN (SELECT Id FROM @ids) 
END 
GO 

而且爲了使用該程序通過實體框架,見this答案。

+0

+1謝謝你這個答案我有一個好主意,但在此期間,我會嘗試它之前,我檢查接受':D' – spajce 2013-03-25 22:03:32

+1

我不會使用動態SQL,除非必要,但主要是由於風險和調試複雜性,而不是性能。有一個性能開銷,但它主要是一個老妻子的故事。看到[速度測試:動態SQL與存儲過程](http://www.blackwasp.co.uk/SpeedTestSqlSproc.aspx) – 2013-03-25 22:06:47

+0

我很抱歉,但我使用'dbContext.Database.SqlQuery (字符串SQL)'來解決我的問題,再次感謝你:) – spajce 2013-03-26 00:03:02