首頁 > 後端開發 > C++ > 如何將數組傳遞到SQL Server存儲的過程?

如何將數組傳遞到SQL Server存儲的過程?

Barbara Streisand
發布: 2025-01-31 08:36:09
原創
252 人瀏覽過

How to Pass an Array to a SQL Server Stored Procedure?

將數組傳遞到 SQL Server 存儲過程

在需要將數據從 C# 作為數組傳遞到 SQL Server 存儲過程的場景中,存在多種方法。本文將探討幾種方法,具體取決於所使用的 SQL Server 版本。

SQL Server 2016(或更高版本)

使用 STRING_SPLIT() 或 OPENJSON(),可以將分隔列表或 JSON 傳遞到存儲過程。

STRING_SPLIT()

<code class="language-sql">CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List varchar(max)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT value FROM STRING_SPLIT(@List, ',');
END
GO</code>
登入後複製

OPENJSON()

<code class="language-sql">CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List varchar(max)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT value FROM OPENJSON(CONCAT('["',
    REPLACE(STRING_ESCAPE(@List, 'JSON'), 
    ',', '","'), '"]')) AS j;
END
GO</code>
登入後複製

SQL Server 2008(或更高版本)

自定義數據類型和表值參數用於數組傳遞。

SQL 數據庫對象

<code class="language-sql">CREATE TYPE dbo.IDList
AS TABLE
(
  ID INT
);
GO

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List AS dbo.IDList READONLY
AS
BEGIN
  SET NOCOUNT ON;

  SELECT ID FROM @List; 
END
GO</code>
登入後複製

C# 代碼

<code class="language-csharp">// 获取员工 ID
int[] employeeIds = GetEmployeeIds();

// 创建 DataTable 并使用员工 ID 填充
DataTable tvp = new DataTable();
tvp.Columns.Add(new DataColumn("ID", typeof(int)));
foreach (int id in employeeIds)
    tvp.Rows.Add(id);

// 将 DataTable 作为参数添加
using (conn)
{
    SqlCommand cmd = new SqlCommand("dbo.DoSomethingWithEmployees", conn);
    cmd.CommandType = CommandType.StoredProcedure;
    SqlParameter tvparam = cmd.Parameters.AddWithValue("@List", tvp);
    tvparam.SqlDbType = SqlDbType.Structured;
    tvparam.TypeName = "dbo.IDList";

    // 执行查询
}</code>
登入後複製

SQL Server 2005

引入自定義拆分函數以進行數組傳遞:

SQL 函數

<code class="language-sql">CREATE FUNCTION dbo.SplitInts
(
   @List      VARCHAR(MAX),
   @Delimiter VARCHAR(255)
)
RETURNS TABLE
AS
  RETURN ( SELECT Item = CONVERT(INT, Item) FROM
      ( SELECT Item = x.i.value('(./text())[1]', 'varchar(max)')
        FROM ( SELECT [XML] = CONVERT(XML, '<i>'
        + REPLACE(@List, @Delimiter, '</i><i>') + '</i>').query('.')
          ) AS a CROSS APPLY [XML].nodes('i') AS x(i) ) AS y
      WHERE Item IS NOT NULL
  );
GO</code>
登入後複製

存儲過程

<code class="language-sql">CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT EmployeeID = Item FROM dbo.SplitInts(@List, ','); 
END
GO</code>
登入後複製

C# 代碼

將數組作為逗號分隔的列表傳遞。

以上是如何將數組傳遞到SQL Server存儲的過程?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板