2017-01-10 24 views
1

我想從已定義的字符串列表中選擇數據,稍後將根據該列表進行基於某些條件的過濾。從字符串列表中選擇數據sql

但是,當我想下面的代碼:

List<string> inventoryList = new List<string>(); 

inventoryList.Add("a147"); 
inventoryList.Add("w150"); 

string.Format("SELECT * FROM (VALUES '{0}') AS InventoryList(InventoryCode)" 
        + " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", inventoryList); 

--- Other codes to connect to the database and so on ---- 

它會產生這樣的:

SELECT * FROM (VALUES 'System.Collections.Generic.List`1[System.String]') AS InventoryList(InventoryCode) SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146 

,而且我得到的錯誤是:

異常:'System.Collections.Generic.List`1 [System.String]'附近的語法不正確。

編輯:

預期結果將創建InventoryListInventoryCode爲列名與內部的上述值:

InventoryList <-- table 
InventoryCode <-- column name 
1. a147 
2. w150 

然後,會像普通查詢:

SELECT a.[InventoryCode] FROM InventoryList a INNER JOIN [PlayerAccount] .... 
+2

您的預期產出是多少? – ekad

+0

而不是你的查詢應該如何? –

+0

嗨@ @ usad和@Mohid Shrivastava,查詢應該如下所示:'SELECT * FROM(VALUES'a147','w150')AS InventoryList(InventoryCode)''然後,在表'InventoryList'後列名爲InventoryCode '有以下數據:'a147'和'w150',然後我將用另一個表格查詢結果。謝謝 – Reinhardt

回答

2

下面

SELECT * FROM (VALUES 'a147', 'w150') AS InventoryList(InventoryCode) 
SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146 

你預期的SQL查詢有兩個問題正數。第一個問題是,下面SELECT語句無效

SELECT * FROM (VALUES 'a147', 'w150') AS InventoryList(InventoryCode) 

你會得到Incorrect syntax near 'a147'錯誤。它應該包括()如下

SELECT * FROM (VALUES ('a147'), ('w150')) AS InventoryList(InventoryCode) 

第二個問題,你不能在第二SELECT聲明做SELECTInventoryList如下

SELECT a.[InventoryCode] FROM [InventoryList] a 

因爲InventoryList是不是一個真正的表。你會得到Invalid object name 'InventoryList'錯誤。

你都應該聯合聲明如下

SELECT a.[InventoryCode] 
FROM (SELECT * FROM (VALUES ('a147'), ('w150')) AS InventoryList(InventoryCode)) a 
INNER JOIN [PlayerAccount] b WITH (NOLOCK) 
    ON a.[InventoryCode] = b.[PlayerInventoryCode] 
WHERE b.[PlayerID] = 146 

現在我們要生成使用C#上面查詢的一部分。如果你有inventoryList定義如下

List<string> inventoryList = new List<string>(); 

inventoryList.Add("a147"); 
inventoryList.Add("w150"); 

您可以使用string.Join組合和LINQ選擇這樣

string values = string.Join(",", inventoryList.Select(x => "('" + x + "')")); 

生成以下的輸出:('a147'),('w150'),然後使用values變量如下產生預期的SQL查詢

string output = string.Format("SELECT a.[InventoryCode] FROM (SELECT * FROM (VALUES {0}) AS InventoryList(InventoryCode)) a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", values); 

在線演示:https://dotnetfiddle.net/yLKsBv

+0

謝謝@ekad。好的解釋和它對我有更多的瞭解,它已經解決了。謝謝你 :) – Reinhardt

1

您需要使用如下的string.format方法。

string.Format("SELECT * FROM (VALUES '{0}','{1}') AS InventoryList" 
           + " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", inventoryList[0] , inventoryList[1]); 

你可以使用的string.joinstring.Join("','", inventoryList.ToArray())物品

string.Format("SELECT * FROM (VALUES '{0}') AS InventoryList" 
           + " SELECT a.[InventoryCode] FROM [InventoryList] a INNER JOIN [PlayerAccount] b WITH (NOLOCK) ON a.[InventoryCode] = b.[PlayerInventoryCode] WHERE b.[PlayerID] = 146", string.Join("','", inventoryList.ToArray())); 
+2

,這將限制在清單 – bansi

+0

@ bansi只有2個項目謝謝你的通知。我更新了代碼。 –