加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

sql – 具有可变参数数量的存储过程

发布时间:2020-12-12 06:24:24 所属栏目:MsSql教程 来源:网络整理
导读:我有存储过程,我必须传递参数,但问题是我不知道有多少参数会来,它可以是1,在下一个运行它可以是5. cmd.Parameters.Add(new SqlParameter("@id",id) 任何人都可以帮助我如何在存储过程中传递这些可变数量的参数? 谢谢 解决方法 您可以以逗号分隔的列表传递它,
我有存储过程,我必须传递参数,但问题是我不知道有多少参数会来,它可以是1,在下一个运行它可以是5.
cmd.Parameters.Add(new SqlParameter("@id",id)

任何人都可以帮助我如何在存储过程中传递这些可变数量的参数?
谢谢

解决方法

您可以以逗号分隔的列表传递它,然后使用拆分函数,并结合结果.
CREATE FUNCTION dbo.SplitInts
(
   @List       VARCHAR(MAX),@Delimiter  CHAR(1)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(INT,Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]','INT')
           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
   );

现在你的存储过程:

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

    SELECT cols FROM dbo.table AS t
        INNER JOIN dbo.SplitInts(@List,',') AS list
        ON t.ID = list.Item;
END
GO

然后叫它:

EXEC dbo.doStuff @List = '1,2,3,...';

您可以在这里查看一些背景,其他选项和性能比较:

> http://sqlblog.com/blogs/aaron_bertrand/archive/2010/07/07/splitting-a-list-of-integers-another-roundup.aspx
> http://sqlperformance.com/2012/07/t-sql-queries/split-strings
> http://sqlperformance.com/2012/08/t-sql-queries/splitting-strings-follow-up

当然,如果您使用的是SQL Server 2008或更高版本,则可以使用表值参数(TVP)更有效地传递这些数据.请看这里快速介绍:

> http://sqlperformance.com/2012/08/t-sql-queries/splitting-strings-now-with-less-t-sql

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读