2017-01-10 23 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个项目谢谢你的通知。我更新了代码。 –