sp_MSforeachtable
の方法を知っています 文書化されておらず、いつでもなくなる/変更される可能性がありますか?
それを無視してよければ、@whereand
という別のパラメータがあります。 、WHERE
に追加されます テーブルの検索に使用されている内部クエリの句(AND
で始まる必要があります) 。
また、エイリアスo
があることも知っておく必要があります。 sysobjects
に対して 、および2番目のエイリアス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(*)
を取り出します 条件も、それがどのような価値を付加しているかわからないので。
今後の作業に基づいて更新され、1つのテーブルに対してテストされました:
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ステートメントの構成を別のアクションに移動しました。