Ответ 1
Вы знаете, как 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 в отдельное действие.