2014-10-22 1 views
1

Я запускаю следующий код, чтобы извлечь все соответствующие строки из всех таблиц, имеющих определенный столбец. Внешний IF должен проверить, существует ли столбец в таблице для этой итерации. Если нет, он должен завершить эту итерацию и перейти к следующей таблице. Если стол имеет столбец GCRecord, он должен проверить, будет ли эта таблица возвращать любые записи. Если для возврата нет записей, это должно прекратить эту итерацию и перейти к следующей таблице. Если есть записи, он должен отображать их в SSMS.SQL Iterate Over All Tables

USE WS_Live 

EXECUTE sp_MSforeachtable 
' 
    USE WS_Live 

    IF EXISTS( SELECT * 
       FROM sys.columns 
       WHERE columns.Object_ID = Object_ID(''?'') 
       AND Name = ''GCRecord'' 
      ) 
    BEGIN 
     IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) 

     BEGIN 
      SELECT * FROM ? WHERE GCRecord IS NOT NULL 
     END 
    END 
' 

Кажется, что это работает, потому что SSMS возвращает только сетки с действительными вводами. Я не понимаю: почему я все еще получаю эти ошибки?

Msg 207, Level 16, State 1, Line 10 
Invalid column name 'GCRecord'. 
Msg 207, Level 16, State 1, Line 13 
Invalid column name 'GCRecord'. 

EDIT

После использования предложения, у меня есть это:

USE WS_Live 

EXECUTE sp_MSforeachtable 
' 
    USE WS_Live 

    IF EXISTS(SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'')AND Name = ''GCRecord'') 

    BEGIN 
    IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) 

      BEGIN 
       EXEC('' SELECT * FROM ? WHERE GCRecord IS NOT NULL'') 
      END 
    END 
' 

который возвращает эту ошибку:

Msg 207, Level 16, State 1, Line 7 
Invalid column name 'GCRecord'. 

который относится к этой линии

IF EXISTS(SELECT * FROM sys.columns WHERE columns.Object_ID = Object_ID(''?'')AND Name = ''GCRecord'') 

UPDATE

Я попытался вложенности EXEC заявления, которые не работают, но с использованием выбранного ответа я получил результаты, которые я искал без ошибок.

+0

Я думаю, что SSMS еще _compiling_ внутренний запрос, даже если он не будет _execute_ его на основе 'EXISTS' результата. –

+0

Вы можете увидеть, есть ли ответ [здесь] (http://stackoverflow.com/questions/9679997/sql-server-sp-msforeachtable-usage-to-select-only-those-tables-which-meet-some-c). –

ответ

2

Использование динамического запроса внутри начать, чтобы избежать внутренней предварительной компиляции кода, для таблицы не содержат столбец «GCRecord»

USE WS_Live 
GO 

EXECUTE sp_MSforeachtable 
' 
    IF EXISTS( SELECT * 
       FROM sys.columns 
       WHERE columns.Object_ID = Object_ID(''?'') 
       AND Name = ''GCRecord'' 
      ) 
    BEGIN 

      EXEC(''   
        IF EXISTS (SELECT * FROM ? WHERE GCRecord IS NOT NULL) 
       BEGIN 
         SELECT * FROM ? WHERE GCRecord IS NOT NULL 
       END 
       '') 
    END 
' 
0

Пожалуйста, попробуйте этот динамический sql. удалить комментарий от exec, когда вы готовы к запуску

declare @t varchar(max) = '' 

SELECT @t = @t + 'SELECT * FROM ' + a.name + ' WHERE GCRecord IS NOT NULL;' + char(13) 
       FROM sys.columns b join sys.objects a on 
       b.Object_ID = a.Object_ID 
       WHERE b.Name ='CreateDt' 

Print @t 
--exec (@t) 
2

Вы очень Закрыть. Используйте «EXEC»

USE WS_Live 

EXECUTE sp_MSforeachtable 
' 
    USE WS_Live 

    IF EXISTS( SELECT * 
       FROM sys.columns 
       WHERE columns.Object_ID = Object_ID(''?'') 
       AND Name = ''GCRecord'' 
      ) 
    BEGIN 
     EXEC(''SELECT * FROM ? WHERE GCRecord IS NOT NULL'') 
    END 
' 
+0

Спасибо. Это приблизило меня. Я добавил обновление. – NonSecwitter

+0

Получил. Спасибо за ответ, я пробовал вложенные выражения EXEC(), которые, по-видимому, не работали. Я переместил их как @ AA.SC, показанный ниже, и я избавился от всех ошибок. – NonSecwitter

0

Использование @whereand для упрощения:

exec sp_MSforeachtable 
@command1='select * from ? where GCRecord is not null', 
@whereand='and exists(select 1 from sys.columns c where c.object_id = o.id 
         and c.name = ''GCRecord'')'