簡體   English   中英

如何使用動態創建的IN集創建存儲過程

[英]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/124330http://sqlservercentral.com/scripts/Miscellaneous/31913

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM