Выбор неудач с неэкзистентными столбцами - PullRequest
3 голосов
/ 29 августа 2009

Выполнение следующего оператора с SQL Server 2005 (мои тесты проходят через SSMS) приводит к успеху при первом выполнении и неудаче при последующих выполнениях.

 IF OBJECT_ID('tempdb..#test') IS NULL 
    CREATE TABLE #test ( GoodColumn INT )
 IF 1 = 0 
    SELECT  BadColumn
    FROM    #test

Это означает, что что-то сравнивает столбцы, к которым я обращаюсь в моем операторе select, со столбцами, которые существуют в таблице, когда скрипт «компилируется». Для моих целей это нежелательный функционал. Мой вопрос: есть ли что-нибудь, что можно было бы сделать, чтобы этот код успешно выполнялся при каждом запуске, или, если это невозможно, возможно, кто-то мог бы объяснить, почему продемонстрированная функциональность желательна. Единственное решение, которое у меня есть в настоящее время, - это обернуть select с помощью EXEC или select *, но мне не нравится ни одно из этих решений.

Спасибо

Ответы [ 4 ]

3 голосов
/ 29 августа 2009

Если поставить:

IF OBJECT_ID('tempdb..#test') IS NOT NULL 
  DROP TABLE #test
GO

В начале проблема исчезнет, ​​так как пакет будет проанализирован до того, как существует таблица #test.

То, что вы просите, чтобы система распознала, что "1 = 0" всегда будет иметь значение false. Если бы это когда-либо было правдой (что потенциально могло бы иметь место для большинства реальных условий), то вам, вероятно, хотелось бы знать, что вы собираетесь запустить что-то, что может вызвать сбой.

Если вы удаляете временную таблицу, а затем создаете хранимую процедуру, которая делает то же самое:

CREATE PROC dbo.test 
AS
BEGIN
  IF OBJECT_ID('tempdb..#test') IS NULL 
    CREATE TABLE #test ( GoodColumn INT )

  IF 1 = 0 
    SELECT  BadColumn
    FROM    #test
END

Тогда это будет с радостью создано, и вы можете запускать его столько раз, сколько захотите.

Rob

0 голосов
/ 29 августа 2009

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

Подробнее о производительности временных таблиц читайте по адресу: Производительность SQL Server.com

0 голосов
/ 29 августа 2009

Эта проблема также видна в следующих ситуациях:

IF 1 = 1
    select dummy = GETDATE() into #tmp
ELSE 
    select dummy = GETDATE() into #tmp

Хотя второй оператор никогда не выполняется, возникает та же ошибка. Похоже, проверка первого уровня обработчика запросов игнорирует все условные операторы .

0 голосов
/ 29 августа 2009

Является ли это поведение «желательно» от точки программиста зрения является дискуссионной, конечно, - это в основном сводится к разнице между статический типизированными и динамически типизированными языками. С точки зрения производительности это желательно, поскольку SQL Server требуется полная информация для компиляции и оптимизации плана выполнения (а также планов выполнения кэша).

Одним словом, T-SQL - это , а не интерпретируемый или динамически типизированный язык, и поэтому вы не можете писать такой код. Вы можете либо использовать EXEC, либо использовать другой язык и встраивать в него SQL-запросы.

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