Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Verwendung von sp_msforeachtable in SQL Server, um nur die Tabellen auszuwählen, die eine bestimmte Bedingung erfüllen

Sie wissen, wie sp_MSforeachtable funktioniert ist undokumentiert und kann jederzeit gelöscht/geändert werden?

Nun, wenn Sie das gerne ignorieren, gibt es einen weiteren Parameter namens @whereand , die an WHERE angehängt wird -Klausel der internen Abfrage, die verwendet wird, um die Tabellen zu finden (und sollte mit einem AND beginnen ).

Sie müssen auch wissen, dass es einen Alias ​​gibt, o gegen sysobjects , und einen zweiten Alias ​​syso gegen sys.all_objects .

Mit diesem Wissen können Sie Ihr @whereand erstellen Parameter als:

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

Sie können jetzt auch Ihren command1 vereinfachen , da Sie wissen, dass es nur gegen Tabellen ausgeführt wird, die einen EMP_CODE enthalten Säule. Ich würde wahrscheinlich den COUNT(*) herausnehmen Bedingung auch, da ich nicht sehe, welchen Wert es hinzufügt.

Basierend auf Ihrer weiteren Arbeit aktualisiert und anhand einer Tabelle getestet:

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'')'

(Ich habe den @whereand zurückgesetzt um nach EMP_CODE abzufragen , da Sie den Wert dort nicht ersetzen möchten).

Das Problem ist, dass Sie Parameter übergeben können zu einer gespeicherten Prozedur oder Literale , aber Sie können keine Berechnungen durchführen/Aktionen zwischen ihnen kombinieren - deshalb habe ich die Konstruktion der SQL-Anweisung in eine separate Aktion verschoben.