从不同数据库获取行的最佳方法是什么?

时间:2012-05-15 22:36:40

标签: c# sql-server linq entity-framework dynamicquery

我有10个相同的数据库。

我在运行时获取数据库名称。

我想将行存储到对象集合中。

我也只想在数据库服务器上点击一次。

我目前的做法: -

  • 在查询中(没有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)
    

我可以使用Linq +实体框架,只需一次命中服务器,无需动态查询,不会影响性能吗?有没有更好的解决方案?

1 个答案:

答案 0 :(得分: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;