我有10个相同的数据库。
我在运行时获取数据库名称。
我想将行存储到对象集合中。
我也只想在数据库服务器上点击一次。
我目前的做法: -
然后我遍历每个数据库并创建一个动态查询并执行它。
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 +实体框架,只需一次命中服务器,无需动态查询,不会影响性能吗?有没有更好的解决方案?
答案 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;