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

SQL Server sp_msforeachtableを使用して、特定の条件を満たすテーブルのみを選択します

    sp_MSforeachtableの方法を知っています 文書化されておらず、いつでもなくなる/変更される可能性がありますか?

    それを無視してよければ、@whereandという別のパラメータがあります。 、WHEREに追加されます テーブルの検索に使用されている内部クエリの句(ANDで始まる必要があります) 。

    また、エイリアスoがあることも知っておく必要があります。 sysobjectsに対して 、および2番目のエイリアスsyso sys.all_objectsに対して 。

    この知識を使用して、@whereandを作成できます。 パラメータ:

    EXEC sp_MSforeachtable 
    @command1='...',
    @whereand='AND o.id in (select object_id from sys.columns c where c.name=''EMP_CODE'')'
    

    command1も簡略化できるようになりました 、EMP_CODEを含むテーブルに対してのみ実行されることがわかっているため 桁。おそらくCOUNT(*)を取り出します 条件も、それがどのような価値を付加しているかわからないので。

    今後の作業に基づいて更新され、1つのテーブルに対してテストされました:

    DECLARE @EMPCODE AS VARCHAR(20)
    SET @EMPCODE='HO081'
    declare @sql nvarchar(2000)
    set @sql = '
        DECLARE @COUNT AS INT
        SELECT @COUNT=COUNT(*) FROM ? WHERE EMP_CODE='''[email protected]+'''
        IF @COUNT>0
        BEGIN
            PRINT PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)''
            --PRINT ''DELETE FROM ''+PARSENAME("?",1)+'' WHERE EMP_CODE='''''[email protected]+'''''''
        END
    '
    EXEC sp_MSforeachtable 
    @[email protected],@whereand='AND O.ID IN (SELECT OBJECT_ID FROM SYS.COLUMNS C WHERE C.NAME=''EMP_CODE'')'
    

    @whereandを元に戻しました EMP_CODEを照会するには 、そこで値を置き換えたくないので)。

    問題は、パラメータを渡すことができるということです ストアドプロシージャ、またはリテラル 、ただし、それらの間で計算/結合アクションを実行することはできません。そのため、sqlステートメントの構成を別のアクションに移動しました。



    1. ユーザーアカウント管理、役割、権限、認証PHPおよびMySQL-パート4

    2. SQLで週番号を抽出する方法

    3. Ansibleを使用したPostgreSQLレプリケーションのセットアップとメンテナンス

    4. Postgres動的クエリ関数