sql >> Databáze >  >> RDS >> Sqlserver

SQL Server sp_msforeachtable použití k výběru pouze těch tabulek, které splňují určitou podmínku

Víte, jak sp_MSforeachtable je nezdokumentovaný a může kdykoli zmizet/být upraven?

No, pokud to rádi ignorujete, má další parametr nazvaný @whereand , který je připojen k WHERE klauzule interního dotazu, která se používá k nalezení tabulek (a měla by začínat AND ).

Musíte také vědět, že existuje alias o proti sysobjects a druhý alias syso proti sys.all_objects .

Pomocí těchto znalostí můžete vytvořit svůj @whereand parametr jako:

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

Nyní můžete také zjednodušit svůj command1 , protože víte, že bude spuštěn pouze proti tabulkám obsahujícím EMP_CODE sloupec. Pravděpodobně bych vyřadil COUNT(*) stav také, protože nevidím, jakou hodnotu to přidává.

Aktualizováno na základě vaší další práce a testováno podle jedné tabulky:

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

(Vrátil jsem zpět @whereand pro dotaz na EMP_CODE , protože tam hodnotu nechcete nahrazovat).

Problém je v tom, že můžete předat parametry na uloženou proceduru nebo literály , ale nemůžete mezi nimi provádět výpočty/kombinovat akce – tak jsem přesunul konstrukci příkazu sql do samostatné akce.



  1. jak zjistit velikost řádku v tabulce

  2. Jak vytvořit křížový dotaz v návrhovém zobrazení v Accessu

  3. SQL Pivot s více sloupci

  4. Jak mohu uvést, že má stejná data ID jako smyčka while v PHP?