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.