2016-10-03 122 views
0

轉換逗號分隔值我有以下查詢:子查詢

Set @OrderStatuses = 'Cancelled,Complete' 

Select * 
From TableName 
Where Status in (@OrderStatuses) 

Status就是我從外部接收,也未能取得任何結果作爲,其實我們需要處理的是:

Select * 
From TableName 
Where Status in ('Cancelled', 'Complete'); 

@OrderStatuses可以包含任意數量的逗號分隔值。

回答

2

一種方法是動態SQL:

declare @sql nvarchar(max); 

set @sql = 'Select * from TableName Where Status in (@list)'; 

set @sql = replace(@sql, '@list', '@OrderStatuses'); 

exec sp_executesql @sql; 

注意:不能在傳遞一個列表作爲參數。

您還可以使用like

Select * 
from TableName 
Where ',' + @OrderStatuses + ',' like '%,' + Status + ',%'; 

但是,這不能使用索引的對比。

1

您將需要使用split string function和處理,其餘..

;with cte 
as 
(
select * from split_strings(@orderstatus,',') 
) 
select * from table where status in (select item from cte) 
1

您必須添加的列表作爲Table-Valued Parameter

這裏有兩種方法我用轉換項目的任何的IEnumerable列表(這種情況下,整數)爲表值參數。您必須爲數據庫中的結果表創建/定義用戶定義類型(UDT)。在UDT下面的例子中被命名爲dbo.keyIds並創建(一次)與該SQL:

CREATE TYPE [dbo].[KeyIds] 
AS TABLE(pkId int NOT NULL, PRIMARY KEY CLUSTERED 
    ([pkId] ASC) WITH (IGNORE_DUP_KEY = OFF) 
) 

C#代碼是:

public class DbParamList : List<IDbDataParameter> 
{ 
    public void AddSQLTableParm<T>(
       string parmName, IEnumerable<T> values) 
    { 
     var parm = new SqlParameter(parmName, CreateDataTable(values)) 
     { 
      SqlDbType = SqlDbType.Structured, 
      TypeName = "dbo.keyIds" 
     }; 
     Add(parm); 
    } 
    internal static DataTable CreateDataTable<T>(IEnumerable<T> values) 
    { 
     var dt = new DataTable(); 
     var props = typeof (T).GetProperties(); 
     if (props.Length > 0) 
     { 
      foreach (var col in props) 
       dt.Columns.Add(col.Name, col.PropertyType); 
      foreach (var id in values) 
      { 
       var newRow = dt.NewRow(); 
       foreach (var prop in id.GetType().GetProperties()) 
        newRow[prop.Name] = prop.GetValue(id, null); 
       dt.Rows.Add(newRow); 
      } 
     } 
     else 
     { 
      dt.Columns.Add("ids"); 
      foreach (var id in values) dt.Rows.Add(id); 
     } 
     return dt; 
    } 
}