欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

SQL Server 存储过程 数组参数 (How to pass an array into a SQL Server stored procedure)

程序员文章站 2023-10-28 16:59:10
Resource from * 使用存储过程,如何传递数组参数? 1.分割解析字符串,太麻烦 2.添加Sql Server 自定义类型 sp_addtype 问题需求:需要向SP 传递数组类型的参数 select from Users where ID IN (1,2,3 ) ......

resource from *

使用存储过程,如何传递数组参数?

1.分割解析字符串,太麻烦
2.添加sql server 自定义类型 sp_addtype

问题需求:需要向sp 传递数组类型的参数
select * from users where id in (1,2,3 )

sql server 数据类型 并没有数组,但是允许自定义类型,通过 sp_addtype
添加 一个自定义的数据类型,可以允许c# code 向sp传递 一个数组类型的参数
但是不能直接使用 sp_addtype,而是需要结构类型的数据格式,如下:

create type dbo.idlist
as table
(
  id int
);
go

有点像个是一个临时表,一种对象,这里只加了id
在sp 中可以声明自定义类型的参数

create procedure [dbo].[dosomethingwithemployees]
    @idlist as  dbo.idlist readonly

example

1. first, in your database, create the following two objects

create type dbo.idlist
as table
(
  id int
);
go

create procedure [dbo].[dosomethingwithemployees]
    @idlist as  dbo.idlist readonly
    
as
     select * from [dbo].[employees] 
      where contactid in
       (  select id from @idlist )
return 

2. in your c# code

// obtain your list of ids to send, this is just an example call to a helper utility function
int[] employeeids = getemployeeids();
datatable tvp = new datatable();
tvp.columns.add(new datacolumn("id", typeof(int)));
// populate datatable from your list here
foreach(var id in employeeids)
      tvp.rows.add(id);
using (conn)
{
    sqlcommand cmd = new sqlcommand("dbo.dosomethingwithemployees", conn);
    cmd.commandtype = commandtype.storedprocedure;
    sqlparameter tvparam = cmd.parameters.addwithvalue("@list", tvp);

    // these next lines are important to map the c# datatable object to the correct sql user defined type
    tvparam.sqldbtype = sqldbtype.structured;
    tvparam.typename = "dbo.idlist";
    
    // execute query, consume results, etc. here
}