Знаете как 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='''[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'')'
(Върнах @whereand
за да потърсите EMP_CODE
, тъй като не искате да замените стойността там).
Проблемът е, че можете да предавате параметри към съхранена процедура или литерали , но не можете да извършвате изчисления/комбиниране на действия между тях – затова преместих конструкцията на оператора sql в отделно действие.