2017-10-12 13 views
0

我一直花費大量時間研究一種方法來適應sql查詢,而在一個循環中爲了從多個表中取回數據。在適當的循環中調整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次,以涵蓋每個分支。

的方法使用加載鏈將結束是與此類似:

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

是否有更好的方法來適應,而其運行的查詢搜索?

+2

mysql!= sql-server,請不要標記不涉及的產品。你爲什麼認爲「varchar max limit可能會被超過」?你認爲限制是什麼? – HoneyBadger

+0

你知道varchar(max)中的限制大概是在一個單元格中的2GB數據? –

+0

不知道這是否有用:'EXECUTE master.sys.sp_MSforeachdb' details here:http://weblogs.sqlteam.com/joew/archive/2008/08/27/60700.aspx,可能不像你希望每次都適應查詢,但是這可以讓您在服務器上的每個數據庫上運行相同的查詢 – Tanner

回答

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