Как получить доступ к temptable после его динамического создания - PullRequest
2 голосов
/ 15 января 2010

Я использую утверждение

SELECT    * 
INTO      #gsig_ref  
FROM      gsign 
WHERE     [name] NOT LIKE 'RESERVE%' OR [name] NOT LIKE 'Spare%'



EXECUTE('SELECT * INTO #db1 FROM ' + @db1)
EXECUTE('SELECT * INTO #db2 FROM ' + @db2)

, где @db1 будет предоставлено во время выполнения (например, @db1 = '#gsig_ref')

Если я скажу select * from #db1 ... это говорит о недопустимом объекте. Пожалуйста, помогите мне, как получить доступ к данным из #db1 .., так как я использовал это в другом запросе, как

SELECT        DISTINCT @p1 INTO #curs_name
FROM          #db1 
WHERE         @p1 NOT IN (SELECT @p2 FROM #db2)
ORDER BY      @p1

Как получить доступ к #db1 в приведенном выше запросе, а также @p1 является входной переменной этой процедуры, и я должен использовать ее для distinct @p1 ..

Пожалуйста, помогите мне в работе над этим Спасибо Рамм

Спасибо Рамм

Ответы [ 4 ]

2 голосов
/ 15 января 2010

Локальная временная таблица, созданная в хранимой процедуре, удаляется по завершении процедуры; другие хранимые процедуры или вызывающий процесс не могут их видеть.

Вы можете сгенерировать весь SQL, эффективно перемещая временную таблицу в динамический SQL, например:

declare @sql varchar(max);
set @sql = 'select into #t1 ....; select * from #t1';
exec (@sql);

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

Другой вариант, если вы уверены, что одновременно выполняется только один вызов, - это использовать глобальную временную таблицу. Они объявлены с двойным хешем, как ##TempTable. Глобальные временные таблицы переживают конец своей процедуры, но на них можно ссылаться из нескольких сеансов.

1 голос
/ 15 января 2010

Вы не можете получить доступ к временным таблицам, объявленным в динамическом SQL.

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

В вашем примере это станет

CREATE TABLE #db1
(...table definition...)

CREATE TABLE #db2
(...table definition...)

EXECUTE('INSERT #db1 SELECT * FROM ' + @db1)
EXECUTE('INSERT #db2 SELECT * FROM ' + @db2)

Вам также нужно будет создать и выполнить второй запрос (используя @p1) в качестве динамического SQL, поскольку вы хотите использовать переменные в качестве заполнителей для имен столбцов.

EDIT

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

Вы можете написать некоторый код для запроса информационной схемы, чтобы сгенерировать и применить динамические сценарии ALTER TABLE к временной таблице, чтобы ее структура соответствовала исходной таблице, но это может оказаться более сложным, чем вы готовы принять.

Предложение Andomar о выполнении всей операции в динамическом SQL может оказаться более подходящим.

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

0 голосов
/ 02 августа 2014

Заранее создайте временные таблицы перед динамическим sql, а затем заполните, используя динамический sql.

См. 4-й метод в http://www.nigelrivett.net/SQLTsql/AccessTempTablesAcrossSPs.html

Надеюсь, это поможет!

0 голосов
/ 15 января 2010

Вы не можете ссылаться на переменные, объявленные в операторе EXEC (например, в ваших временных таблицах), вне этого оператора.

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