首页 > 后端开发 > C++ > 如何将数组传递到SQL Server存储的过程?

如何将数组传递到SQL Server存储的过程?

Barbara Streisand
发布: 2025-01-31 08:36:09
原创
302 人浏览过

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()

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List varchar(max)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT value FROM STRING_SPLIT(@List, ',');
END
GO
登录后复制

OPENJSON()

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
登录后复制

SQL Server 2008(或更高版本)

自定义数据类型和表值参数用于数组传递。

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
登录后复制

C# 代码

// 获取员工 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";

    // 执行查询
}
登录后复制

SQL Server 2005

引入自定义拆分函数以进行数组传递:

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
登录后复制

存储过程

CREATE PROCEDURE dbo.DoSomethingWithEmployees
  @List VARCHAR(MAX)
AS
BEGIN
  SET NOCOUNT ON;

  SELECT EmployeeID = Item FROM dbo.SplitInts(@List, ','); 
END
GO
登录后复制

C# 代码

将数组作为逗号分隔的列表传递。

以上是如何将数组传递到SQL Server存储的过程?的详细内容。更多信息请关注PHP中文网其他相关文章!

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板