Дочерний sProc не может ссылаться на локальную временную таблицу, созданную в родительском sProc - PullRequest
1 голос
/ 21 мая 2010

В нашем производственном экземпляре 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 год, но я хотел бы узнать более точно, почему это происходит, прежде чем я уйду и попытаюсь внести необходимые исправления. Благодарю.

Ответы [ 2 ]

2 голосов
/ 21 мая 2010

Совместное использование временной таблицы между хранимыми процедурами - хорошая функция для использования: http://www.sommarskog.se/share_data.html#temptables, Я удивлен, что она не работает для вас Возможно, вам следует попробовать очень простой пример и посмотреть, сработает ли это. Тогда, если это сработает, начните искать другие причины.

попробуйте это из окна запроса в Management Studio:

создайте эти две процедуры:

CREATE PROCEDURE called_procedure 
(@par1 int, @par2 char(5))
AS
INSERT INTO  #tmp VALUES (@par1,@par2)
GO

CREATE PROCEDURE caller
AS

CREATE TABLE #tmp (col1 int     NOT NULL
                  ,col2 char(5) NULL
                  )
EXEC called_procedure 1, 'AAA'
EXEC called_procedure 2, 'BBB'

SELECT * FROM #tmp
GO

затем запустите их:

exec caller

Это то, что я получаю на SQL Server 2005:

col1        col2
----------- -----
1           AAA  
2           BBB  

(2 row(s) affected)
1 голос
/ 21 мая 2010

Мы делаем это сейчас (в 2000, 2005 и 2008 годах) в точности так, как вы описали, без необходимости менять локальные на глобальные временные таблицы.

...