質問

テーブルをサーバーにエクスポートしましたが、テーブルが見つかりません。たぶん私は正しい宛先データベースを入れなかった。サーバーに複数のデータベースがある場合、各データベースを開かずにこのテーブルを見つけるにはどうすればよいですか?

MS Sql Server Management Studio 2008を使用しています。

役に立ちましたか?

解決

粗くて汚いですが、それでうまくいきます。

-- Instructions. Replace "table_name_here" with actual table name
sp_MSforeachdb 'USE ?
IF EXISTS (SELECT * FROM dbo.sysobjects WHERE id = OBJECT_ID(N''[table_name_here]'') AND OBJECTPROPERTY(id, N''IsUserTable'') = 1)
BEGIN
  PRINT ''Found in db ?''
END'

他のヒント

片道

SELECT  DISTINCT DB_NAME(database_id) 
FROM [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)
WHERE OBJECT_NAME(object_id,database_id) = 'table_name'

または、いずれかのデータベースの dbo スキーマにあると合理的に確信している場合

SELECT name
FROM   sys.databases
WHERE  CASE
         WHEN state_desc = 'ONLINE' 
              THEN OBJECT_ID(QUOTENAME(name) + '.[dbo].[table_name]', 'U')
       END IS NOT NULL 

上記のMartin Smithの回答に基づいていますが、sys.tablesのクロスDBバージョンのようなものを提供するビューに一般化されています-

CREATE VIEW ListTablesAllDBs

AS

SELECT 
    DB_NAME(database_id) as DBName,
    OBJECT_SCHEMA_NAME(object_id,database_id) as SchemaName,
    OBJECT_NAME(object_id,database_id) as TableName
FROM
    [sys].[dm_db_index_operational_stats](NULL,NULL,NULL,NULL)

今、列に対しても同じことをする方法を考え出すことができるなら............

編集-これは無視してください。テーブルが完全に欠落することがあります。

DBに名前を付ける方法がわからない「スーパーユーザー」の人たちの頭痛を避けるための軽微な説明:

EXEC sp_MSForEachDB '
USE [?]
IF OBJECT_ID(''mytable'') IS NOT NULL AND
   OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
PRINT ''Found here: ?'''
select 'select * from '+name+'.sys.tables where name=
        ''[yourtable]'';' from sys.databases

[yourtable]の代わりに、不足しているテーブルの名前を入力し、結果を再度実行します。

EXEC sp_MSForEachDB '
USE ? 
IF OBJECT_ID(''mytable'') IS NOT NULL AND
   OBJECTPROPERTY(OBJECT_ID(''mytable''), ''IsTable'') = 1
    PRINT ''?''
'
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top