Вы знаете, как 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='''+@EMPCODE+'''
IF @COUNT>0
BEGIN
PRINT PARSENAME("?",1)+'' => ''+CONVERT(VARCHAR,@COUNT)+'' ROW(S)''
--PRINT ''DELETE FROM ''+PARSENAME("?",1)+'' WHERE EMP_CODE='''''+@EMPCODE+'''''''
END
'
EXEC sp_MSforeachtable
@command1=@sql,@whereand='AND O.ID IN (SELECT OBJECT_ID FROM SYS.COLUMNS C WHERE C.NAME=''EMP_CODE'')'
(я вернул @whereand
, чтобы запросить EMP_CODE
, так как вы не хотите заменять значение там).
Проблема в том, что вы можете передать параметры для хранимой процедуры или литералы , но вы не можете выполнять вычисления / комбинировать действия между ними - поэтому я перенес конструкцию оператора sql в отдельное действие.