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.