sql >> Databasteknik >  >> RDS >> Sqlserver

SQL Server sp_msforeachtable användning för att välja endast de tabeller som uppfyller något villkor

Du vet hur sp_MSforeachtable är odokumenterad och kan försvinna när som helst/modifieras?

Tja, om du gärna ignorerar det, har den en annan parameter som heter @whereand , som läggs till i WHERE sats i den interna frågan som används för att hitta tabellerna (och bör börja med en AND ).

Du måste också veta att det finns ett alias, o mot sysobjects , och ett andra alias syso mot sys.all_objects .

Med hjälp av denna kunskap kan du skapa din @whereand parameter som:

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

Du kan nu också förenkla ditt command1 , eftersom du vet att det bara kommer att köras mot tabeller som innehåller en EMP_CODE kolumn. Jag skulle förmodligen ta ut COUNT(*) skick också, eftersom jag inte ser vilket värde det tillför.

Uppdaterad baserat på ditt fortsatta arbete och testat mot en tabell:

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

(Jag har återställt @whereand för att fråga efter EMP_CODE , eftersom du inte vill ersätta värdet där).

Problemet är att du kan skicka parametrar till en lagrad procedur eller bokstaver , men du kan inte utföra beräkningar/kombinationsåtgärder mellan dem - så jag flyttade ut konstruktionen av SQL-satsen till en separat åtgärd.



  1. Är kolumn- och tabellnamn skiftlägeskänsliga i MySQL?

  2. Hur kan jag matcha de två sista orden i en mening i PostgreSQL?

  3. Hur man delar upp ett kommaseparerat värde till kolumner

  4. MySQL Trigger för att förhindra INSERT under vissa förhållanden