Выберите * не возвращать все столбцы - Coldfusion / SQL Server 2008 - PullRequest
3 голосов
/ 15 июня 2011

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

У меня есть таблица данных с именем myTable с несколькими столбцами; пока все, что с этим связано, было в порядке. Теперь я только что добавил столбец с именем subTitle; и я замечаю, что SELECT * Запрос, который извлекает данные для данной записи, не знает об этом столбце (он говорит, что возвращенный запрос не имеет столбца subTitle), но если я явно назову столбец (выберите subTitle), он является. Возможно, я подумал, что сервер Coldfusion может кэшировать запрос, поэтому я попытался обойтись с cachedwithin="#CreateTimeSpan(0, 0, 0, 0)#", но без кубиков.

Рассмотрим следующий код:


<cfquery name="getSub" datasource="#Application.datasourceName#">
     SELECT   subTitle 
     FROM     myTable
     WHERE    RecordID = '674'
 </cfquery> 

 <cfoutput>#getSub.subTitle#</cfoutput>

 <cfquery name="getInfo" datasource="#Application.datasourceName#">
     SELECT   * 
     FROM     myTable
     WHERE    RecordID = '674'
 </cfquery>  

 <cfoutput>#getInfo.subTitle#</cfoutput>

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

тест

[[CRASH WITH ERROR]]

Это не имеет смысла для меня, если SQL Server 2008 каким-то образом не кэшировал запрос SELECT * с предыдущим воплощением таблицы, но странно то, что если я запускаю запрос прямо из SQL Management Studio, проблем не возникает и он показывает все столбцы с выбором *

Честно говоря, этот сбил меня с толку; Я знаю, что могу обойти это, явно назвав все нужные столбцы в запросе выбора вместо использования * (что в любом случае является наилучшей практикой), но я хочу понять, почему это происходит.

Я работал с SQL Server 2005 много лет и никогда не случалось ничего подобного, что наводит меня на мысль, что в SQL Server 2008 может быть что-то новое; но с другой стороны, тот факт, что запрос отлично работает внутри управленческой студии, тоже не с этим связан.

=== UPDATE ===

Очистка кэша шаблонов в администраторе CF решит проблему

Ответы [ 2 ]

8 голосов
/ 15 июня 2011

Да, ColdFusion кэширует строку SQL <cfquery>.Если базовая структура таблицы изменится, результатом может быть исключение, как вы его видите.

Обходные пути:

  • Рекомендуемые решения:
    • Если у вас есть версия для разработчиков или корпоративная версия, вы можете просмотреть кэш запросов в мониторе сервера и очистить только те запросы, которые там есть. (комментарий @Dpolehonski, спасибо)
    • В противном случае нажмите Очистить кэш шаблона сейчас в Администраторе ColdFusion (в разделе Настройки сервера / Кэширование ).
      Это сделает недействительными все кэшированные CFML-шаблоны на сервере, и CF при необходимости перекомпилирует их.
  • Быстро и грязно:
    Слегка измените SQL запроса, например, добавьте пробел где-нибудь.Когда вы находитесь на компьютере разработчика, это самый быстрый способ исправить проблему.
    Это аннулирует только скомпилированную версию этого запроса и приведет к повторной компиляции.
    (Обратите внимание, что удаление незначительного изменения приведет кснова вызвать ошибку, поскольку старый текст запроса останется в кэше.)
  • Перебор:
    Перезапустите сервер ColdFusion.Брутальный, но эффективный.
2 голосов
/ 15 июня 2011

Или быстрый и супер грязный метод:

<cfquery name="getInfo" datasource="#Application.datasourceName#">
   SELECT 
     *, #createUUID()# as starQueryCacheFix
   FROM 
     myTable
   WHERE 
   RecordID = '674'
 </cfquery>

Не оставляйте в производственном коде, хотя ... он устареет во всем, что делает ColdFusion с кэшированием запросов. Я сказал, что это было очень грязно;)

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