如何向sql server存储过程传递一个数组

最近写一段程序 要求向存储过程传递一个字符串数组或者集合 然后通过not in进行条件判断

仔细研究后在csdn上找到了解决该问题的办法帖出来给大家共享一下

大致方法是利用传递长字符串的形式向存储过程传递一个长字符串。由于sqlserver没有 splite函数

所以必须自己定义一个splite函数来进行处理

 

自定义一个函数
create function f_splitstr(@SourceSql varchar(8000),@StrSeprate varchar(10))
returns @temp table(F1 varchar(100))
as
begin
 declare @i int
 set @SourceSql=rtrim(ltrim(@SourceSql))
 set @i=charindex(@StrSeprate,@SourceSql)
 while @i>=1
 begin
  insert @temp values(left(@SourceSql,@i-1))
  set @SourceSql=substring(@SourceSql,@i+1,len(@SourceSql)-@i)
  set @i=charindex(@StrSeprate,@SourceSql)
 end
 if @SourceSql<>''
    insert @temp values(@SourceSql)
 return
end
-执行
select * from dbo.f_splitstr('1,2,3,4',',')

 

注:'1,2,3,4'即你所传递的字符串

同样你可以通过 select cunt(*) from dbo.f_splitstr('1,2,3,4',',')

获得该字符串数组的长度

如果要删除该函数使用

--删除函数
drop function fsplit

*************************************************************************

还有另外一种方法,这是充分利用了SQL Server强大的字符串功能

不过由于用到了exec命令,所以只能在存储过程中实现

create procedure f_splitstr (@SourceSql varchar(8000),@StrSeprate varchar(10))
as

create table #temp (F1 varchar(100))
declare @TmpSql varchar(8000)

select @TmpSql = 'insert into #temp values ('+ replace (@SourceSql,@StrSeprate,')
insert into #temp values (')+')'

exec(@TmpSql)

select * from #temp

drop table #temp
go

f_splitstr4 '1,2,3,4',','

结果是一样的 .

 

 

 

 

1

2

3

4

5

6

7

8

8

9

9

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用SQL Server中的表值参数(Table-valued parameter,TVP)来传递字符串数组存储过程。 具体的做法是,首先在数据库中创建一个类型为Table type的对象,这个对象定义了一个表结构,用于存储传递字符串数组。例如,可以创建一个名为`POList`的Table type对象,该对象包含一个名为`PONumber`的列,用于存储传递的PO Number。 创建完Table type对象后,可以在存储过程的参数列表中添加一个参数,类型为上面创建的Table type对象。在存储过程中,可以将这个参数作为输入参数,使用类似于以下的语句来获取传递字符串数组: ``` DECLARE @POList POListType; INSERT INTO @POList (PONumber) VALUES ('PO111'), ('PO112'), ('PO113'); ``` 这样就可以将字符串数组传递存储过程,然后在存储过程中使用T-SQL语句来处理这个数组。例如,可以使用以下的语句来查询这个数组中的PO Number: ``` SELECT PONumber FROM @POList; ``` 在C#代码中,可以使用DataTable来表示这个Table type对象,然后将DataTable传递存储过程。例如,在C#代码中可以使用以下的语句来创建一个包含多个PO Number的DataTable: ``` DataTable poList = new DataTable(); poList.Columns.Add("PONumber"); poList.Rows.Add("PO111"); poList.Rows.Add("PO112"); poList.Rows.Add("PO113"); ``` 然后可以将这个DataTable作为参数传递存储过程,例如: ``` using (SqlCommand cmd = new SqlCommand("MyStoredProcedure", conn)) { cmd.CommandType = CommandType.StoredProcedure; SqlParameter poListParam = cmd.Parameters.AddWithValue("@POList", poList); poListParam.SqlDbType = SqlDbType.Structured; poListParam.TypeName = "dbo.POListType"; // ... add other parameters ... // execute the stored procedure SqlDataReader reader = cmd.ExecuteReader(); // ... } ``` 这样就可以将字符串数组传递存储过程了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值