2017-10-12 3 views
0

複数のテーブルから戻すために、ループ中にSQLクエリを適合させる方法を研究するのにかなりの時間を費やしてきました。whileループでSQLクエリを適応させる

これを可能にする方法の1つは、ロード・ストリングとしてクエリを実行することです(このリンクで説明されているように: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) 

は、その実行中にクエリの検索を適応させるためのより良い方法はありますか?

+2

mysql!= sql-server、関連していない製品にタグを付けないでください。なぜあなたは "varchar最大限を超える可能性が高い"と思いますか?限界は何だと思いますか? – HoneyBadger

+0

varchar(max)の制限は、1つのセルで2GB程度のデータしかないことに気付いていますか? –

+0

これが使用されるかどうかわからない: 'EXECUTE master.sys.sp_MSforeachdb'の詳細はこちら: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 
関連する問題