6

SQL Serverのインスタンスをクエリして、特定の名前のテーブルを含むデータベースのリストを取得しようとしています。これは私がこれまでに持っているものです...

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句でcallを使用するための正しい構文は何ですか?または、私がやろうとしていることを行う別の方法はありますか?

4

5 に答える 5

4

いいえ、句で使用execすることはできません。where動的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;
于 2012-04-16T15:51:08.557 に答える
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;
   }
}
于 2012-04-16T22:08:11.850 に答える
1

このSQLステートメントは、探しているテーブルを含むすべてのデータベース名を提供します。

EXEC sp_MSForEachDB 'USE [?]; select ''?'' from information_schema.tables where table_name = ''TheTableName''' ;
于 2012-04-16T15:53:11.473 に答える
0

execから情報を取得するには、一時テーブルを使用する必要があります。

これを試して

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
于 2012-04-16T16:02:12.697 に答える
0

ストアドプロシージャの結果を一時テーブルに格納してから、WHERE句に追加することもできます。

于 2013-02-08T14:39:07.117 に答える