sql >> Database teknologi >  >> RDS >> Sqlserver

SQL Server sp_msforeachtable brug til kun at vælge de tabeller, der opfylder en eller anden betingelse

Du ved, hvordan sp_MSforeachtable er udokumenteret og kan til enhver tid forsvinde/modificeres?

Nå, hvis du er glad for at ignorere det, har den en anden parameter kaldet @whereand , som er tilføjet WHERE klausul i den interne forespørgsel, der bliver brugt til at finde tabellerne (og bør starte med en AND ).

Du skal også vide, at der er et alias, o mod sysobjects , og et andet alias syso mod sys.all_objects .

Ved at bruge denne viden kan du måske lave 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 også forenkle din command1 , da du ved, at den kun vil blive kørt mod tabeller, der indeholder en EMP_CODE kolonne. Jeg ville sandsynligvis fjerne COUNT(*) tilstand også, da jeg ikke kan se, hvilken værdi det tilføjer.

Opdateret baseret på dit videre arbejde og testet mod én tabel:

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

(Jeg har gendannet @whereand for at forespørge efter EMP_CODE , da du ikke ønsker at erstatte værdien der).

Problemet er, at du kan sende parametre til en lagret procedure eller bogstaver , men du kan ikke udføre beregninger/kombinationshandlinger imellem dem - så jeg flyttede konstruktionen af ​​sql-sætningen ud i en separat handling.



  1. En databasemodel til en onlineundersøgelse. Del 4

  2. hvad er oracle EBS R12

  3. ORA-12505, TNS:listener kender i øjeblikket ikke til SID givet i connect des

  4. Giv MySQL tabel- og kolonnetilladelser