Знаете как sp_MSforeachtable е недокументиран и може да изчезне по всяко време/да бъде променен?
Е, ако сте щастливи да игнорирате това, той има друг параметър, наречен @whereand , който е добавен към WHERE клауза на вътрешната заявка, която се използва за намиране на таблиците (и трябва да започва с AND ).
Трябва също да знаете, че има псевдоним, o срещу sysobjects и втори псевдоним syso срещу sys.all_objects .
Използвайки тези знания, можете да създадете своя @whereand параметър като:
EXEC sp_MSforeachtable
@command1='...',
@whereand='AND o.id in (select object_id from sys.columns c where c.name=''EMP_CODE'')'
Вече можете също да опростите вашата command1 , тъй като знаете, че ще се изпълнява само срещу таблици, съдържащи EMP_CODE колона. Вероятно бих премахнал COUNT(*) условие също, тъй като не виждам каква стойност добавя.
Актуализиран въз основа на по-нататъшната ви работа и тестван спрямо една таблица:
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='''example@sqldat.com+'''
IF @COUNT>0
BEGIN
PRINT PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)''
--PRINT ''DELETE FROM ''+PARSENAME("?",1)+'' WHERE EMP_CODE='''''example@sqldat.com+'''''''
END
'
EXEC sp_MSforeachtable
@example@sqldat.com,@whereand='AND O.ID IN (SELECT OBJECT_ID FROM SYS.COLUMNS C WHERE C.NAME=''EMP_CODE'')'
(Върнах @whereand за да потърсите EMP_CODE , тъй като не искате да замените стойността там).
Проблемът е, че можете да предавате параметри към съхранена процедура или литерали , но не можете да извършвате изчисления/комбиниране на действия между тях – затова преместих конструкцията на оператора sql в отделно действие.