динамически создает таблицу #temp, а затем используется для вставки данных - PullRequest
1 голос
/ 30 марта 2010

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

select * into # temp from schema.tableName where 1<>1;

insert into # temp from exec(table)

Пока я делаю этот оператор как переменнуюпередать другое tableName, оно не работает

SET @TEMPSCHEMA = 'SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'

exec(@TEMPSCHEMA)


INSERT INTO #temp

EXEC ( @SELECTSTATEMENT

)

, однако после оператора exec он не принимает значения во временную таблицу.

показывает недопустимый идентификатор объекта # temp

Ответы [ 5 ]

3 голосов
/ 30 марта 2010

Это связано с тем, что область действия оператора EXEC отличается от области действия содержащего sproc. То есть, ваш вызов EXEC создает временную таблицу, а затем она автоматически отбрасывается при оставлении области действия EXEC. По сути, вы должны делать все внутри оператора one EXEC:

DECLARE @sql VARCHAR(MAX)
SET @sql = 'SELECT * INTO #temp
            FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1
            INSERT INTO #temp ...'

EXEC(@sql)
1 голос
/ 30 марта 2010

Запуск динамических операторов, необходимых для вставки данных во временную таблицу с использованием оператора into, не поддерживается. Созданный временную таблицу ранее, а затем использовать динамический запрос для вставки в временную таблицу будет работать нормально. причина в том, что когда используется оператор exec (), он запускается в дочернем контексте, и как только контекст закрывается, динамическая временная таблица также теряется.

1 голос
/ 30 марта 2010

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

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

1 голос
/ 30 марта 2010

Как только динамический SQL завершает выполнение, локальная временная таблица выходит из области видимости.

Вы должны сделать что-то вроде этого:

-- everything w/ dynamic sql
SET @TEMPSCHEMA = '
  SELECT * INTO #temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;
  INSERT INTO #temp EXEC (@SELECTSTATEMENT)
  SELECT .... -- whatever else you need to do
  '

exec sp_executesql @TEMPSCHEMA, N'@SELECTSTATEMENT NVARCHAR(MAX)', @SELECTSTATEMENT

или

-- global temp table rather than local
SET @TEMPSCHEMA = 'SELECT * INTO ##temp FROM ' + @PKSchema + '.dbo.' + @PKTableName + ' WHERE 1<>1;'
exec(@TEMPSCHEMA)

INSERT INTO ##temp EXEC (@SELECTSTATEMENT)
0 голосов
/ 30 марта 2010

Будет ли exec (@TEMPSCHEMA) работать в контексте, отличном от вашей процедуры, и, следовательно, #temp прекратит существование, как только завершится exec?

Ах да, вот оно

  • В хранимой процедуре или триггере все операторы, содержащие имя временной таблицы, должны ссылаться на временную таблицу, созданную в той же хранимой процедуре. Временная таблица не может быть создана в вызывающей или вызываемой хранимой процедуре или в строке, выполняемой с использованием EXECUTE или sp_executesql.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...