存储过程如何用 数组 或者 集合 参数?

indusl 2014-05-04 11:37:34
比如我用用 select * from A where [typeID] in (@type)



@type 里面有很多内容,比如(1,2,3,5,8,10); 但是@type不是固定的,需要动态传参数,怎么办
...全文
1323 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
hexiaojie 2014-05-07
  • 打赏
  • 举报
回复
进来学习大神们的思路
lg314 2014-05-06
  • 打赏
  • 举报
回复
这几天做项目的时候试过很多方法 1. 字符串分离方法,性能一般,cpu消耗稍微高一些,适合数量少的时候,生成出记录统计信息总是一行 2.CLR方法,性能比较好,记录数特别多的时候和少的时候都不错,实际测试的时候cpu消耗的read都很少,但duration比较高,而且重复多次执行也不会降下来,可能是启动clr方法或者释放资源的时候占用的时间。 3.自定义表变量的方法,和表变量差不多,生成表变量的时候会产生一些write 4.xml 方法,性能可以接受,cpu消耗和read都不是很高,延迟小,统计信息和真实的有点差距,一般比实际的多,不知道是用什么东西评估的,如果调用的程序知道条目数的话 可以用 select top (@count)的方法给编译器一些提示,生成的执行计划比较接近实际.
shinger126 2014-05-06
  • 打赏
  • 举报
回复
变量表当参数传递需要SQL2005以上版本
發糞塗牆 2014-05-04
  • 打赏
  • 举报
回复
这是例子:
--1.函数
if exists(select * from sys.objects where name = 'f_splitSTR' and type = 'tf')
   drop function dbo.f_splitSTR
go
 
create function dbo.f_splitSTR
(
    @s varchar(8000),     --要分拆的字符串
    @split varchar(10)    --分隔字符
) 
returns @re table(                      --要返回的临时表
                     col varchar(1000)  --临时表中的列 
                 )
as
begin   
  declare @len int
   
  set @len = LEN(@split)      --分隔符不一定就是一个字符,可能是2个字符
   
  while CHARINDEX(@split,@s) >0
  begin
    insert into @re 
    values(left(@s,charindex(@split,@s) - 1))
     
    set @s = STUFF(@s,1,charindex(@split,@s) - 1 + @len ,'')    --覆盖:字符串以及分隔符
  end
   
  insert into @re values(@s)
   
  return   --返回临时表
end
go  
 
 
 
declare @res varchar(100)
set @res='1 2 3 4 5';
 
set @res = REPLACE(@res,' ',',')
 
select * from dbo.f_splitSTR(@res,',') t 
/*
col
1
2
3
4
5
*/
然后你可以: select a.* from a inner join 函数所生成的表 on a.xx=b.xx 这样就可以筛选出a表中这些ID的数据
indusl 2014-05-04
  • 打赏
  • 举报
回复
引用 3 楼 DBA_Huangzj 的回复:
建议通过一个函数把ID生成成一个表的格式再in或者join,过多的ID会引发性能问题
那如何传参数呢 ,如何把表当做参数传递
發糞塗牆 2014-05-04
  • 打赏
  • 举报
回复
建议通过一个函数把ID生成成一个表的格式再in或者join,过多的ID会引发性能问题
indusl 2014-05-04
  • 打赏
  • 举报
回复
引用 1 楼 DBA_Huangzj 的回复:
方法一
CREATE PROC D_t_Base_Employee @str varchar(100)
as
declare @sql varchar(1000)
set @sql='DELETE Employee WHERE ID IN ('+@str+')'
exec (@sql)
 
go
 
方法二
CREATE PROC D_t_Base_Employee @str varchar(100)
as
DELETE Employee WHERE CHARINDEX(','+CAST(id as varchar)+',',','+@str+',')>0
go
可是ID很多,比如有个树状菜单,勾选了很多ID, 1000个字符,甚至3000个字符都没法满足怎么办
發糞塗牆 2014-05-04
  • 打赏
  • 举报
回复
方法一
CREATE PROC D_t_Base_Employee @str varchar(100)
as
declare @sql varchar(1000)
set @sql='DELETE Employee WHERE ID IN ('+@str+')'
exec (@sql)
 
go
 
方法二
CREATE PROC D_t_Base_Employee @str varchar(100)
as
DELETE Employee WHERE CHARINDEX(','+CAST(id as varchar)+',',','+@str+',')>0
go

22,300

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧