0

同一のデータベースが 10 個あります。

実行時にデータベース名を取得します。

行をオブジェクトのコレクションに格納したいと考えています。

また、データベース サーバーで 1 つのヒットのみが必要です。

私の現在のアプローチ:-

  • クエリ (X の理由でストアド プロシージャはありません) で、データベースのリストを取得し、一時テーブルに格納します。
  • 次に、各データベースを繰り返し処理し、動的クエリを作成して実行します。

    DECLARE @MaxRownum int SET @MaxRownum = (SELECT MAX(RowNum) FROM #Databases) 
    DECLARE @Iter int SET @Iter = 1
    WHILE @Iter <= @MaxRownum
    BEGIN
    DECLARE @Database varchar(255) SELECT @Database = Databases FROM #Databases 
          WHERE RowNum = @Iter
    IF HAS_DBACCESS(@Database) > 0
        BEGIN 
          //appending query
    END
    SET @Iter = @Iter + 1
    END
    EXEC(@Query)
    

動的クエリを使用せず、パフォーマンスを低下させることなく、サーバーへの 1 回のヒットで Linq + エンティティ フレームワークを使用できますか? より良い解決策はありますか?

4

1 に答える 1

1

あなたのクエリが何であるかわからない(私は尋ねましたが、あなたはそれを提供しませんでした)、そして「動的クエリ」なしで変数としてデータベース名を提供することが非常に難しいことを理解しているかどうかわからない場合は、はるかに簡単な方法がありますそれを行うには私見:

DECLARE @sql NVARCHAR(MAX);

SELECT @sql = N'';

SELECT @sql = @sql + CHAR(13) + CHAR(10) + 'UNION ALL'
    --// you will need to fill in your "//appending query" stuff here:
    + ' SELECT ... FROM ' + QUOTENAME(Databases) + '.dbo.tablename'
 FROM #Databases
 WHERE HAS_DBACCESS(Databases) = 1;

SET @sql = STUFF(@sql, 1, 9, '');

EXEC sp_executesql @sql;
于 2012-05-15T23:46:45.420 に答える