我有一些SQL通過盲目需求/請求轉換爲存儲過程。在我看到的應用程序中有一點SQL使用動態IN(set)語句構建where子句。我已經搜索了動態存儲過程,但沒有接近我正在尋找的東西對我來說。這裏是WHERE子句的示例:如何使用動態創建的IN集創建存儲過程
WHERE Var.A = @Param AND Var.Id IN
從這裏SQL是使用字符串生成器手動構建的,然後執行。不知道如何將它轉換爲存儲過程,因爲我對它們相當陌生。
我們正在使用C#和SQL Server
我有一些SQL通過盲目需求/請求轉換爲存儲過程。在我看到的應用程序中有一點SQL使用動態IN(set)語句構建where子句。我已經搜索了動態存儲過程,但沒有接近我正在尋找的東西對我來說。這裏是WHERE子句的示例:如何使用動態創建的IN集創建存儲過程
WHERE Var.A = @Param AND Var.Id IN
從這裏SQL是使用字符串生成器手動構建的,然後執行。不知道如何將它轉換爲存儲過程,因爲我對它們相當陌生。
我們正在使用C#和SQL Server
您可以使用用戶定義的數據類型。
在C#方面,它應該是這樣的:
//Setup a DataTable with the same structure as the SQL Type
var data = new DataTable();
data.Columns.Add("value", typeof(string));
//Populate the table
data.Rows.Add("oneID");
data.Rows.Add("anotherID");
//You create your sql command
cmd.Parameters.Add("@listArgument", data);
//Command execution
SQL一邊,你可以有一種這樣的
CREATE TYPE [dbo].[NVarCharTable] AS TABLE (
[value] NVARCHAR(MAX) NOT NULL);
然後存儲過程:
CREATE PROCEDURE [dbo].[MyProc]
@listArgument NVarCharTable READONLY
AS
BEGIN
SELECT *
FROM FOO
WHERE Var.Id IN (Select [value] FROM @listArgument)
END
參考:https://docs.microsoft.com/en-us/dotnet/framework/data/adonet/sql/table-valued-parameters
如果您使用的是SQl SERVER 2016或更高版本,則可以使用string_split函數將csv參數轉換爲表格,然後將其用於您的IN列表中。
SELECT * FROM TBL WHERE Var.A = @Param AND Var.Id IN (SELECT value FROM STRING_SPLIT(@inlist, ','))
希望這有助於
上捎帶關閉@lostmylogin的,你可以通過在界定的參數,並使用這些SQL函數來解析爲一個表:
http://sqlservercentral.com/scripts/SUBSTRING/124330 或 http://sqlservercentral.com/scripts/Miscellaneous/31913
如何將用戶定義的表格類型從C#發送到proc? – hardkoded
這聽起來不錯。但我不知道這意味着什麼。我會研究這個角度。謝謝大聲笑 – Matt1776
@ Matt1776:根據各種因素,IN子句可以是從良性到病態的不良表現。由於IN子句的目的是過濾返回的行,INNER JOIN子句也是這樣做的(除了引入額外的列之外),執行INNER JOIN而不是IN會比較好,而且往往會更好。 (回想一下,INNER JOIN只返回兩個表中匹配連接字段的行。) –