[英]How to create a stored procedure with dynamically created IN set
我有一些SQL,我通過盲需求/請求轉換為存儲過程。 我正在查看的應用程序中有一些SQL,它使用動態IN(set)語句構建where子句。 我已經搜索了動態存儲過程但是沒有接近我正在尋找的東西。 以下是WHERE子句的示例:
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.