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='''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ステートメントの構成を別のアクションに移動しました。