आप जानते हैं कि कैसे 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 स्टेटमेंट के निर्माण को एक अलग क्रिया में स्थानांतरित कर दिया।