Данные SQL из одной из двух таблиц - PullRequest
1 голос
/ 17 июня 2011

У меня есть две таблицы, где только один столбец одинаков. Я пытаюсь написать хранимую процедуру, которая извлекает значение из переданного имени столбца, но существует только в одной из таблиц. Вот что я написал:

IF EXISTS(
SELECT identifier FROM TableA WHERE identifier='12345')
SELECT ColumnWhichOnlyExistsInA FROM TableA WHERE identifier='12345'
ELSE
SELECT ColumnWhichOnlyExistsInA FROM TableB WHERE identifier='12345'

Это дает мне сообщение об ошибке «Недопустимое имя столбца» в последней строке, даже если оператор IF верен, и он должен только извлекать данные из TableA. Я заметил, что если я заменю два нижних оператора SELECT хранимыми процедурами, которые делают то же самое, это работает; SQL не пытается выполнить тот, где IF ложно.

Я хочу сохранить все в одной хранимой процедуре. Как лучше всего это сделать?

Ответы [ 3 ]

1 голос
/ 17 июня 2011

Ваш запрос не может быть COMPILE, потому что компилятор проверяет, существуют ли столбцы, которые должны быть выбраны, в соответствующих таблицах - поэтому оператор IF никогда не выполняется.

Он работает в отдельных хранимых процедурах, потому что они компилируются по требованию во время выполнения, и, таким образом, будет компилироваться только "работающий" хранимый процесс.

Чтобы обойти проблему, используйте Dynamic SQL

 DECLARE @SQLString varchar(max)
 IF EXISTS (SELECT idenfier FROM TableA WHERE identifier='12345')
 BEGIN
    SET @SQLString = 'SELECT ColumnWhichOnlyExistsInA FROM TableA WHERE identifier=''12345'''
 END
 ELSE
 BEGIN
    SET @SQLString = 'SELECT ColumnWhichOnlyExistsInA FROM TableB WHERE identifier=''12345'''
 END

 EXECUTE sp_executesql @SQLString
0 голосов
/ 17 июня 2011

перед запуском SQL, анализатор попытается проанализировать SQL, что также означает, что он попытается проверить, все ли столбцы ссылок находятся в таблице или нет

, например, приведенные ниже не будутработа, потому что в таблице нет столбца с именем name1 sys.table

IF EXISTS(SELECT 1 FROM sys.tables WHERE name='foo') 
    SELECT * from sys.objects where name= 's'
ELSE 
    SELECT * from sys.tables where name1= 's'

Так что если TableB не имеет идентификатора в качестве столбца, появится ошибка

0 голосов
/ 17 июня 2011

Вы пробовали запросить схему в качестве первого теста? Например выберите table_name из information_schema.columns, где column_name = 'ColumnWhichOnlyExistsInA'

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...