Как спроектировать использование Глобальной временной таблицы для многопользовательской среды?(или альтернативы) - PullRequest
2 голосов
/ 27 ноября 2010

Мне нужно создать временную таблицу в одной из моих хранимых процедур. Данные для вставки во временную таблицу получены из динамического сводного запроса, поэтому я привязан к динамическому SQL. Так это становится примерно так -

set query = 'select ....'+ pivotcols + 
            ' into ##temp_table
              from base_table
              pivot (
              max(col1)
              for col2 in 
              (' + pivotcols +' as final'

 exec(query)

Здесь я не могу использовать локальную временную таблицу (#temp_table), так как таблица, созданная в динамическом sql, не будет доступна для остальной хранимой процедуры. В итоге я использую глобальную временную таблицу (## temp_table).

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

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

РЕДАКТИРОВАТЬ: отредактировал «переменную» в заголовке вопроса до «таблицы»

Ответы [ 2 ]

1 голос
/ 27 ноября 2010

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

set query = 'select ....'+ pivotcols + 
            ' into ##temp_table' + REPLACE(CAST(NEWID() as varchar(50)), '-','')

NEWID () будет каждый раз давать другое значение.

0 голосов
/ 27 ноября 2010

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

IF OBJECT_ID('##temp') IS NOT NULL
drop table ##temp

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

...