sql >> Database >  >> RDS >> Sqlserver

SQL Server sp_msforeachable gebruik om alleen die tabellen te selecteren die aan een bepaalde voorwaarde voldoen

Je weet hoe sp_MSforeachtable is niet gedocumenteerd en kan op elk moment verdwijnen/worden gewijzigd?

Nou, als je dat graag negeert, het heeft een andere parameter genaamd @whereand , die wordt toegevoegd aan de WHERE clausule van de interne query die wordt gebruikt om de tabellen te vinden (en moet beginnen met een AND ).

Je moet ook weten dat er een alias is, o tegen sysobjects , en een tweede alias syso tegen sys.all_objects .

Met deze kennis kun je je @whereand . maken parameter als:

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

U kunt nu ook uw command1 simplify vereenvoudigen , omdat je weet dat het alleen wordt uitgevoerd tegen tabellen met een EMP_CODE kolom. Ik zou waarschijnlijk de COUNT(*) . verwijderen staat ook, omdat ik niet zie welke waarde het toevoegt.

Bijgewerkt op basis van je verdere werk en getest aan de hand van éé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'')'

(Ik heb de @whereand teruggezet opvragen voor EMP_CODE , aangezien u de waarde daar niet wilt vervangen).

Het probleem is dat u parameters kunt doorgeven naar een opgeslagen procedure, of literals , maar je kunt geen berekeningen uitvoeren/acties ertussen combineren - dus heb ik de constructie van de sql-instructie verplaatst naar een aparte actie.



  1. Ontbrekende indexen in MS SQL of optimalisatie in een mum van tijd

  2. parameter ophalen uit opgeslagen procedure?

  3. Monitor SQL Database via SP_WhoIsActive of FogLight | Problemen met SQL Server-prestaties oplossen -1

  4. Kan ik een transactie terugdraaien die ik al heb gepleegd? (data verlies)