SQL循环与IN(...)子句

时间:2014-05-06 12:20:31

标签: sql loops in-clause

我有一个动态SQL语句,可以在每次调用时处理数百万行。传入参数列表可以为null,但如果填充,则它们可以包含一个或多个参数。我使用的中间层框架非常通用,可以通过相同的Web服务方法调用来调用数据库服务器上的任何存储过程,并且我不能选择在中间进行任何更改。层。因此,VARCHARS的传入参数列表最初看起来像:

        IF (@acct_nums is not null)
            SET @SQL_Y2 = @SQL_Y2 + ' AND a.acct in ('+ @acct_nums +') '
        IF (@source_codes is not null)
             SET @SQL_Y2 = @SQL_Y2 + ' AND a.source in ('+ @source_codes +') '

以上意味着如果UI想要传入一个acct nums列表,则需要将格式化列表传递为

    '''123456'' '','' ''456789'''

但是,建议通过UI避免这种格式化并创建动态查询,如:

        IF (@acct_gl_nums is not null)
            SET @SQL_Y2 = @SQL_Y2 + ' AND a.acct_gl in ('''+ @acct_gl_nums +''') '
        IF (@source_codes is not null)
             SET @SQL_Y2 = @SQL_Y2 + ' AND a.source in ('''+ @source_codes +''') '

但是,我认为这只会在每个参数中支持1个值(否则我不认为我可以将VARCHAR列表格式化为 - >(' 123456',&# 39; 4546789')< - )。为了解决这个问题,建议是打破传入列表并循环遍历值,每个值执行一次语句。

我没有SQL专家,但这不是很贵吗?我有2个潜在的参数列表,每个参数列表的值没有上限,即使我这样做了,也不是通过循环多次执行语句比使用它执行一次更昂贵IN语句填充了所有值?

如前所述,我无法改变设计因此无法修改传入的参数,因此解决此问题的Mid Tier修复是不可行的。

0 个答案:

没有答案