2012-04-16 73 views
5

我想查询一个SQL Server实例,给我一个包含特定名称表的数据库列表。这是我迄今为止...有没有办法在where子句中使用`exec`?

select name 
from master..sysdatabases 
where (exec('use ' + name + '; select 1 from information_schema.tables 
    where table_name = ''TheTableName'';')) = 1; 

,但我得到了以下错误消息

Msg 156, Level 15, State 1, Line 4 
Incorrect syntax near the keyword 'exec'. 
Msg 102, Level 15, State 1, Line 4 
Incorrect syntax near 'name'. 

什么是使用调用exec()在where子句中正确的语法?还是有另一种方法来做我想做的事情?

回答

3

不,您不能在where子句中使用exec。怎么样动态SQL:

DECLARE @sql NVARCHAR(MAX); 

SET @sql = N'SELECT name = NULL WHERE 1 = 0'; 

SELECT @sql = @sql + N' 
    UNION ALL SELECT name = ''' + name + ''' 
    WHERE EXISTS (SELECT 1 FROM ' + QUOTENAME(name) 
    + '.sys.tables WHERE name = ''TheTableName'')' 
    FROM sys.databases; 

EXEC sp_executesql @sql; 
+0

嗯有点比我的短一点 – 2012-04-16 16:19:47

1

此SQL语句会给你所有包含的表,你的数据库名称正在寻找:

EXEC sp_MSForEachDB 'USE [?]; select ''?'' from information_schema.tables where table_name = ''TheTableName''' ; 
+0

记住这是一个无证的sp虽然。您还可以为每个数据库获取结果集,而不是包含所有相关数据库的结果集。好吧,对于管理员来说,尽管我在应用代码中使用它之前我会深思熟虑。 – 2012-04-16 16:14:09

+0

同意!我假定需要通过数据库模式搜索表格是管理员的需要。 – schellack 2012-04-16 16:26:15

+0

我喜欢这个解决方案很简洁,但我更喜欢一个结果集而不是每个结果集的结果集。 – 2012-04-16 17:45:11

0

你必须使用临时表来获得信息反馈从执行。

试试这个

Create Table #TableLocations(DatabaseName varchar(255) not null) 
Declare @databaseName VarChar(255) 
Declare @QueryString VarChar(255) 
Declare DatabaseNameCursor Cursor For Select [Name] From sys.databases 
Declare @TableName VarChar(255) 
Select @TableName = 'Put your table name here' 
Open DatabaseNameCursor 
Fetch Next From DatabaseNameCursor Into @databaseName 
While @@Fetch_Status = 0 
Begin 
    Select @QueryString = 'Use ' + @databaseName + ' Insert into #TableLocations Select ''' + @databaseName + ''' From information_schema.tables Where Table_Name = ''' + @TableName + '''' 
    Exec(@QueryString) 
    Fetch Next From DatabaseNameCursor Into @databaseName 
End 
Close DatabaseNameCursor 
DeAllocate DataBaseNameCursor 
Select * from #TableLocations 
Drop Table #TableLocations 
2

PowerShell的是专为这样的:

$server = new-object Microsoft.SqlServer.Management.Smo.Server "."; 
foreach ($db in $server.Databases) { 
    $t = $db.Tables | where {$_.Schema -eq 'YourSchema' -and $_.Name -eq 'TableName'}; 
    if ($t -ne $null) { 
     $db.Name; 
    } 
} 
+0

为什么选择使用PowerShell而不是从OP的T-SQL中解决问题? – 2012-04-16 22:33:02

+0

在这种情况下可能是好的,但PowerShell并没有为此做出,如果你可以在dbms中做到这一点(在合理范围内),你应该这样做。 – 2012-04-17 00:05:07

+0

为什么?动态SQL中缺少卷积。请注意,我是如何不必跳过篮圈来逃避报价的?另外,MS曾经说过powershell是管理的未来。为什么不抓住每一个机会在有意义的地方应用它。我认为这是有道理的。最后,OP说,我引用:“或者有另一种方法可以做我想做的事情吗?”。为什么是,是的。 – 2012-04-17 02:02:59

0

您也可以从存储过程的结果存储在一个临时表,然后将其添加到WHERE子句

相关问题