2009-06-25 3 views
-1

У нас есть пакет SP, в котором мы создаем запрос, а затем выполняем запрос с помощью вызова exec(@select), где переменная, содержащая SQL-запрос по мере ее построения, равна @select.Странная ошибка «Недопустимое имя столбца» при выполнении SP

Мне был назначен запрос на добавление нового столбца в набор результатов, возвращаемый SP. Этот новый столбец не должен возвращаться при любых обстоятельствах, но только при определенном условии. Естественно, я добавил следующий код в SP.

IF @conditionIsMet 
BEGIN 
set @select = @select + ", 'compQty' = convert(varchar(53), di.qty) " 
END 

Это работало отлично до сегодняшнего дня, когда мое приложение продолжает бросать исключение SQL с сообщением «Invalid имя столбца: compQty». Это неустойчиво, и исключение не выбрасывается всегда.

Выполнение SP в SQL Server Management Studio не дает ошибок. Столбец отображается с заголовком «compQty». Таким образом, приложение должно забрать столбец, но это не похоже!

Может ли кто-нибудь помочь?

+0

журнала значение @ Выберите, сравните «он сработал» с «он сработал» и посмотрите, есть ли шаблон –

+0

@KM, когда он терпит неудачу, я запускаю SP в Management Studio, и я могу увидеть столбец compQty. Похоже, что resultSet.getString ("compQty") не видит столбец compQty. –

+0

Вы пробовали полностью указать столбец i.e. tablename.compQty? Кроме того, вместо использования кавычек лучше использовать квадратные скобки, то есть [tablename]. [CompQty]. –

ответ

1

Не окружать имя столбца в одинарных кавычках 'compQty '

+0

@Mitch, я попробовал это, и это сработало некоторое время, но проблема снова вернулась. :-(Кроме того, перед этим есть другие поля, которые имеют одинарные кавычки.Кажется, что с ними не проблема. –

0

Это кажется мне, как Котировочные идентификаторы является вопросом здесь.

Кажется, что в вашей среде была изменена настройка для цитируемых идентификаторов, что вызвало исключение. Используйте это в начале вашего запроса:

Set Quoted_Identifier OFF;

Редактировать: Вы иногда бросаете проблему, а иногда не потому, что ваше условие IF не всегда выполняется.

+0

@ Tapori, мы установили ANSI_NULLS ON и установили QUOTED_IDENTIFIER OFF в начале нашего SP. –

+0

@ Tapori, наш поток состоит в том, что SP будет выполняться дважды - в первый раз условие не выполняется, а во второй раз выполняется условие IS. Поэтому, если он не работает из-за IF, он должен терпеть неудачу каждый раз. Но не так здесь - сначала это провалилось, затем я удалил кавычки вокруг имени столбца, как предложил @Mitch, и он сработал, и теперь он снова не работает. –

1

, относящиеся к котировочной проблеме Identifier, что @Tapori идентифицированной: если хранимая процедура выглядит следующим образом:

CREATE PROCEDURE [dbo].[usp_Something] 
AS 
    SET QUOTED_IDENTIFIER OFF 

    DECLARE @select NVARCHAR(200) 

    SET @select = 'SELECT * FROM table WHERE ''col1'' = 42' 
GO 

Тогда вы будете иметь проблемы. Проблема заключается в том, что настройка QUOTED_IDENTIFIER не имеет значения, когда хранимая процедура выполняется, имеет значение, когда сохраненный proc имеет , созданный. Так что вам действительно нужно:

SET QUOTED_IDENTIFIER OFF 
GO 
CREATE PROCEDURE [dbo].[usp_Something] 
AS 
    DECLARE @select NVARCHAR(200) 

    SET @select = 'SELECT * FROM table WHERE ''col1'' = 42' 
GO 

И посмотрите, что это делает.

0

Если у вас есть та же таблица в более чем одной схеме вы можете столкнуться с недопустимое имя столбца

Решение: явное определение схемы: [schemaName].[tableName]

Смежные вопросы