SQL循环vs IN(…)子句

SQL循环vs IN(…)子句,sql,loops,in-clause,Sql,Loops,In Clause,我有一个动态SQL语句,在每次调用中可能会处理数百万行。传入参数列表可以为空,但如果填充,它们可以包含1个或多个参数。我使用的中间层框架非常通用,DB服务器上的任何存储过程都可以通过相同的webservice方法调用,我没有在中间层进行任何更改的选项。因此,varchar的传入参数列表最初看起来像: IF (@acct_nums is not null) SET @SQL_Y2 = @SQL_Y2 + ' AND a.acct in ('+ @acct_n

我有一个动态SQL语句,在每次调用中可能会处理数百万行。传入参数列表可以为空,但如果填充,它们可以包含1个或多个参数。我使用的中间层框架非常通用,DB服务器上的任何存储过程都可以通过相同的webservice方法调用,我没有在中间层进行任何更改的选项。因此,varchar的传入参数列表最初看起来像:

        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 NUM列表,它需要将格式化的列表作为

    '''123456'' '','' ''456789'''
但是,建议用户界面避免这种格式设置,并创建动态查询,如:

        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','4546789'))您可能需要指定应用程序语言/UI和db。例如,SQL Server的最新版本具有一些库可以使用的
数组
参数类型。您还需要以某种方式验证该列表,否则您将面临SQL注入的风险。最好的全面选项之一是将该列表拆分为某种可以使用的临时表t join to-对于特定的数据库有很多问题。Hi-UI是C#,MT是java,sybase 15.5创建一个临时表并将传入的列表值插入其中?就像这样!