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

すべてのデータベースのすべてのプロシージャで参照されているすべての列を一覧表示する

    これにより目的のリストが取得されますが、そのような列参照が動的 SQL に埋め込まれている場合は役に立ちません (遅延名前解決に依存する参照が見つからない場合があります)。 SQL Server は、ストアド プロシージャのテキストを解析して DMV 出力を作成しません。

    COLLATE で今すぐ試してください 照合順序が異なる同じサーバー上にデータベースがある場合に対処する句。

    DECLARE @sql NVARCHAR(MAX) = N'';
    
    SELECT @sql += N'UNION ALL
    SELECT 
      [database]  = ''' + REPLACE(name, '''', '''''') + ''',
      [procedure] = QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name)
                    COLLATE Latin1_General_CI_AI, 
      [table]     = QUOTENAME(referenced_schema_name) + ''.'' 
                  + QUOTENAME(referenced_entity_name)
                    COLLATE Latin1_General_CI_AI,
      [column]    = QUOTENAME(referenced_minor_name)
                    COLLATE Latin1_General_CI_AI
    FROM ' + QUOTENAME(name) + '.sys.schemas AS s
    INNER JOIN ' + QUOTENAME(name) + '.sys.procedures AS p
    ON s.[schema_id] = p.[schema_id]
    CROSS APPLY ' + QUOTENAME(name) 
    + '.sys.dm_sql_referenced_entities'
    + '(QUOTENAME(s.name) + ''.'' + QUOTENAME(p.name), N''OBJECT'') AS d
    WHERE d.referenced_minor_id > 0'
    FROM sys.databases 
      WHERE database_id > 4 
      AND [state] = 0;
    
    SET @sql = STUFF(@sql,1,11,'');
    
    EXEC sp_executesql @sql;
    

    CROSS APPLY も 80 互換モードのデータベースがある場合、構文は機能しません。そのようなデータベースでコードを実行しないことを確認してください。正常に動作するはずです (ターゲット データベースの一部が 80 であっても)。



    1. 内部結合クエリの解凍エラーからの更新セット

    2. .NETまたはMSSQLを使用したMySqlのpassword()暗号化のシミュレーション

    3. MySQLで特権を差し引く方法

    4. Mysqlトリガー/イベントとCronjob