有什么方法可以在“ sp_msforeachdb”循环内运行的“ sp_MSforeachtable”循环内引用该表?
例如,在以下查询中,“?” 总是引用数据库:
DECLARE @cmd VARCHAR(8000);
SET @cmd = 'USE ?; EXEC sp_MSforeachtable @command1="select db_name = DB_NAME(), db_foreach = ''?'', tb_foreach = ''?'' "'
EXEC sp_msforeachdb @command1 =@cmd
导致:
db_name db_forearch tb_foreach
ServerMonitor master master
我想要类似的东西:
db_name db_forearch tb_foreach
ServerMonitor master <TABLE_NAME>
我应该改变什么?
解决了。正如肖恩所建议的那样,我使用了ow游标。但是Ben Thul建议的@replacechar解决方案正是我想要的。
DECLARE @cmd VARCHAR(8000);
SET @cmd = 'USE ^; EXEC sp_MSforeachtable @command1="select db_name = DB_NAME(), db_foreach = ''^'', tb_foreach = ''?'' "'
EXEC sp_msforeachdb @command1 =@cmd, @replacechar = '^'
看一下sp_msforeachtable的参数。其中之一是@replacechar,默认情况下它是一个问号(即?)。随意传递另一个同样不太可能在查询中出现的字符(可能是^)。
当然,如果我没有提到这取决于您要执行的操作(我会说您要在所有表上执行的所有操作都可以通过这种方式执行),那我会很失落。在powershell中读取(和写入)解决方案:
import-module sqlps -disablenamechecking;
$s = new-object microsoft.sqlserver.management.smo.server '.';
foreach ($db in $s.databases) {
foreach ($table in $db.Tables) {
$table | select parent, name; --merely list the table and database
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句