Anda tahu bagaimana sp_MSforeachtable
tidak didokumentasikan, dan dapat hilang kapan saja/diubah?
Nah, jika Anda dengan senang hati mengabaikannya, ia memiliki parameter lain yang disebut @whereand
, yang ditambahkan ke WHERE
klausa kueri internal yang digunakan untuk menemukan tabel (dan harus dimulai dengan AND
).
Kamu juga harus tahu kalau ada alias, o
terhadap sysobjects
, dan alias kedua syso
terhadap sys.all_objects
.
Dengan menggunakan pengetahuan ini, Anda dapat membuat @whereand
parameter sebagai:
EXEC sp_MSforeachtable
@command1='...',
@whereand='AND o.id in (select object_id from sys.columns c where c.name=''EMP_CODE'')'
Sekarang Anda juga dapat menyederhanakan command1
, karena Anda tahu itu hanya akan dijalankan terhadap tabel yang berisi EMP_CODE
kolom. Saya mungkin akan mengeluarkan COUNT(*)
kondisi juga, karena saya tidak melihat nilai apa yang ditambahkan.
Diperbarui berdasarkan pekerjaan Anda selanjutnya, dan diuji pada satu tabel:
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'')'
(Saya telah mengembalikan @whereand
untuk menanyakan EMP_CODE
, karena Anda tidak ingin mengganti nilainya di sana).
Masalahnya adalah, Anda dapat melewati parameter ke prosedur tersimpan, atau literal , tetapi Anda tidak dapat melakukan penghitungan/menggabungkan tindakan di antara keduanya - jadi saya memindahkan konstruksi pernyataan sql ke dalam tindakan terpisah.