Я запускаю следующий код, чтобы извлечь все соответствующие строки из всех таблиц, имеющих определенный столбец. Внешний 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
заявления, которые не работают, но с использованием выбранного ответа я получил результаты, которые я искал без ошибок.
Я думаю, что SSMS еще _compiling_ внутренний запрос, даже если он не будет _execute_ его на основе 'EXISTS' результата. –
Вы можете увидеть, есть ли ответ [здесь] (http://stackoverflow.com/questions/9679997/sql-server-sp-msforeachtable-usage-to-select-only-those-tables-which-meet-some-c). –