ホームページ >バックエンド開発 >C++ >SQLサーバーのストアドプロシージャに配列を渡す方法は?

SQLサーバーのストアドプロシージャに配列を渡す方法は?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-31 08:36:09304ブラウズ

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

<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>
ストレージ手順

c#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>

アレイをコンマのリストとして渡します。

以上がSQLサーバーのストアドプロシージャに配列を渡す方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。