sql >> データベース >  >> RDS >> Sqlserver

名前のセットに含まれるSQLServer2000-2008の複数のテーブルから列名を選択する方法

    SQLServer2005以降の場合

    SQLServerの新しいバージョンのFWIW私はINFORMATION_SCHEMAよりもカタログビューを好みます このブログ投稿で概説されている理由のために:

    INFORMATION_SCHEMAに対する訴訟 ビュー

    トピックテーブル(Transact-SQL) MSDN:

    したがって、私が使用するクエリは次のようになります(システムオブジェクトを除外し、tempdbにいる場合は#tempテーブルを回避します):

    SELECT t.name, c.name
      FROM sys.tables AS t
      INNER JOIN sys.columns AS c
      ON t.[object_id] = c.[object_id]
      WHERE c.name IN (N'name', N'firstname', etc.)
      AND t.is_ms_shipped = 0
      AND t.name NOT LIKE '#%';
    

    すべてのデータベースに対してこれを繰り返すには:

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += N'
      UNION ALL SELECT db = N''' + name + ''', 
        t.name COLLATE Latin1_General_CI_AI, 
        c.name COLLATE Latin1_General_CI_AI
      FROM ' + QUOTENAME(name) + '.sys.tables AS t
      INNER JOIN ' + QUOTENAME(name) + 'sys.columns AS c
      ON t.[object_id] = c.[object_id]
      WHERE c.name IN (N''name'', N''firstname'', etc.)
      AND t.is_ms_shipped = 0
      AND t.name NOT LIKE ''#%'''
    FROM sys.databases
    -- WHERE ... -- probably don't need system databases at least
    
    SELECT @sql = STUFF(@sql, 1, 18, '') 
      -- you may have to adjust  ^^ 18 based on copy/paste, cr/lf, tabs etc.
      + ' ORDER BY by db, s.name, o.name';
    
    EXEC sp_executesql @sql;
    

    COLLATE 照合が異なるデータベースがある場合のエラーを防ぐために、句があります。)

    SQLServer2000の場合

    上記はSQLServer2000には役立ちませんが、すべてのバージョンで同じクエリを実行できるようにすることを目標にするべきではないと思います。 SQL Server 2000は13年前のもので、数年サポートされていません。確かにあなたはそれのための特別なコードを持つことを正当化することができます。その場合でも、INFORMATION_SCHEMAではなくクエリを選択します 、システムオブジェクトと一時テーブルを除外するだけです(ここでも、tempdbにいる場合にのみ関連します):

    SELECT [object] = so.name, [column] = sc.name, 
      [type]  = st.name,   [precision] = st.xprec, 
      [scale] = st.xscale, st.length
    FROM sysobjects AS so
    INNER JOIN syscolumns AS sc
    ON  so.id = sc.id
    INNER JOIN systypes AS st
    ON sc.xtype = st.xtype
    WHERE sc.name IN 
      (N'first', N'fname', N'firstname', N'namef', N'namefirst', N'name')
    AND so.name NOT LIKE '#%'
    AND OBJECTPROPERTY(so.id, 'IsMsShipped') = 0;
    

    これは、SQL Server 2000のデータベースごとにも実行できますが、NVARCHAR(MAX)を使用できないためです。 カーソル、一連の変数、またはあまり推奨されないsp_msforeachdb



    1. 分割ビューの実行計画

    2. jsonbキーに対してLIKEクエリを実行するにはどうすればよいですか?

    3. sqliteデータベースで日付を並べ替えますか?

    4. Simple Encrypted Arithmetic Library(SEAL)とseal::Ciphertext変数