2014-10-31 2 views
0

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

Любые идеи?

Я подключаюсь к базе данных MS SQL Server 2005 через OLE DB (поставщик SQLOLEDB) с использованием ADO.

'Create a temporary table on the SQL Server and insert into it the info for the end part 
With ADOcmA 
    Set .ActiveConnection = mObjCON 
    .CommandType = adCmdText 
    .CommandText = "IF OBJECT_ID('" & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
    .Execute 
    .CommandText = "CREATE TABLE " & TEMPTABLE & " (ITEM VARCHAR(255),DESCRIP1 CHAR(255),DESCRIP2 CHAR(255), LEV INT, SEQ VARCHAR(255), FLAG1 TINYINT, PRIMARYKEY INT IDENTITY(1,1) PRIMARY KEY,QTY_PER FLOAT)" 
    .Execute 
    .CommandText = "Insert Into " & TEMPTABLE & " (ITEM,DESCRIP1,DESCRIP2,LEV,SEQ,FLAG1,QTY_PER) select item_no,Item_desc_1,Item_desc_2,1,1,'1',1 FROM " & cstrMACtItem & " WHERE Item_no ='" & strITEM & "' " 
    .Execute 
End With 

FWIW TempTable имя создается во время выполнения, используя формат #[WSID]TEMP[NOW] и усеченный до 116 символов, так, например: TEMPTABLE=#LOKSPEC1TEMP141031155408

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

+0

Видимо, так как ваш вопрос помечен как дубликат, я не могу добавить ответ, но ответ прост, что вы пытаетесь сбросить сеанс локального временную таблицы (один # -prefix, например #tmp) , в отличие от глобальной таблицы temp (два # -prefix, например ## tmp), и это две совершенно разные вещи. –

ответ

2

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

.CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
2

Изменения Темпа запроса падения таблицы к этому

CommandText = "IF OBJECT_ID('tempdb.." & TEMPTABLE & "') IS NOT NULL DROP TABLE " & TEMPTABLE 
0

Я также нашел другой подход, который работает, глядя в том же tempdb месте.

.CommandText = "IF EXISTS (SELECT * FROM TEMPDB.SYS.TABLES WHERE NAME LIKE '" & TEMPTABLE & "%') DROP TABLE " & TEMPTABLE 
.Execute 
+2

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

Смежные вопросы