在while循环中调整SQL查询

时间:2017-10-12 08:50:58

标签: sql sql-server tsql

我花了相当多的时间研究一种方法来调整sql查询,而在循环中为了从多个表中恢复。

我遇到的一种方法可以将查询作为加载字符串执行,然后每次循环运行时都可以调整查询(通过此链接解释:https://docs.microsoft.com/en-us/sql/relational-databases/system-stored-procedures/sp-executesql-transact-sql)。

更具体地说,我试图运行一个相当大的查询,它循环遍历多个数据库 - 但是每个数据库都有一个分支号,例如A,B,C,D,E等。所以每次我执行查询我使用连接从A转到我需要的所有数据库。为了使这项工作,我需要复制并粘贴整个500行查询,超过5次以覆盖每个分支。

使用loadstring的方法最终会与此类似:

DECLARE process varchar(max) = 'select * from Vis_' + Branch[i] + '_Quotes' exec(process)

是否有更好的方法可以在运行时调整查询搜索?

1 个答案:

答案 0 :(得分:1)

以下是如何使用它的一个示例。目前尚不清楚这是否符合您的要求,但似乎动态SQL对您来说是新的,所以我提供了一个包含循环和安全传递参数的示例。这是未经测试的,但希望能让你走上正确的轨道。

这假设您有一个现有的分支表和相应的分支代码(理想情况,因为在添加/禁用/删除分支时脚本不需要更新)。如果不这样做,那么您总是可以创建一个表变量并在脚本顶部插入分支:

declare @sql varchar(max),
        @BranchCode nvarchar(10) = '',
        @param1 int,
        @param2 nvarchar(10);

while 1=1 begin
  set @BranchCode = 
    (select top 1 Code from Branch where Active = 1 and Code > @BranchCode order by Code)
  if @BranchCode is null break;
  set @sql = @sql + 'select * from Vis_' + @BranchCode + '_Quotes
                     where col1 = @param1 and @col2 like @param2
' -- notice extra linebreak (or space) added to separate each query
end

exec sp_executesql @sql, 
  '@param1 int, @param2 nvarchar(10), ...', -- parameter definitions
  @param1, @param2, ... -- any additional parameters you need to safely pass in