Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Използване на SQL Server sp_msforeachtable за избор само на онези таблици, които отговарят на някакво условие

Знаете как 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 в отделно действие.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Динамичен SQL за генериране на имена на колони?

  2. Създаване на многоетапна задача за агент на SQL Server (T-SQL)

  3. Как да създадете първичен ключ в SQL Server (T-SQL примери)

  4. Кога трябва да използвам точки и запетая в SQL Server?

  5. Как да добавите номера на редове в SQL Server Management Studio (SSMS) - SQL Server / TSQL урок, част 11