我花了相当多的时间研究一种方法来调整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)
是否有更好的方法可以在运行时调整查询搜索?
答案 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