从字符串sql列表中选择数据

时间:2017-01-10 03:25:57

标签: c# 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 个答案:

答案 0 :(得分:2)

您预期的SQL查询

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

有两个问题。第一个问题是,以下SELECT语句无效

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

您将收到Incorrect syntax near 'a147'错误。它应包括(),如下所示

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

第二个问题,您无法在第二个SELECT声明中InventoryList SELECT {/ 1}}

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

答案 1 :(得分: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.join string.Join("','", inventoryList.ToArray())用于n个项目

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()));