В нашем производственном экземпляре SQL2000 у нас есть база данных с сотнями хранимых процедур, многие из которых используют метод раннего создания таблицы #TEMP в коде, а затем различные внутренние хранимые процедуры выполняются EXECUTEd этим родительским sProc. , В SQL2000 внутренний или «дочерний» sProc без проблем вставляют в #TEMP или выбирают данные из #TEMP. Короче говоря, я предполагаю, что все они могут ссылаться на этот #TEMP, потому что они используют одно и то же соединение.
При тестировании с SQL2008 я обнаружил 2 проявления различного поведения. Во-первых, во время разработки новая функция «intellisense» жалуется в Management Studio EDIT дочернего sProc на то, что #TEMP является «недопустимым именем объекта». Но хуже всего то, что во время выполнения вызванный родительский sProc завершается ошибкой внутри вложенного дочернего sProc.
Кто-то предположил, что решение состоит в том, чтобы перейти на ## TEMP, который, по-видимому, является глобальной временной таблицей, на которую можно ссылаться из разных соединений.
Это кажется слишком радикальным предложением, как с точки зрения объема работы по поиску всех проблемных точек, так и с возможными / вероятными неприятными эффектами, когда эти sProcs вызываются из веб-приложений (то есть, проблемы с многопользовательским режимом).
Действительно ли это изменение поведения в SQL2005 или SQL2008 относительно #TEMP (локальные временные таблицы)? Мы пропустили 2005 год, но я хотел бы узнать более точно, почему это происходит, прежде чем я уйду и попытаюсь внести необходимые исправления. Благодарю.