2012-07-19 3 views
1

Вот мой сценарий. (Вслед за мой ХП с @date в качестве входного параметра)Ошибка при использовании временных таблиц с одинаковыми именами SQL Server

DECLARE @date DATE 

If object_id('tempdb..#TempList') is not null drop table #TempList 
go 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date IS NULL 

Insert into #TempList 
Select mill_no, null, bl_status,footage from fn_A(0,0) 

Select * from #TempList 


If object_id('tempdb..#TempList') is not null drop table #TempList 
go 

Create Table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date IS NOT NULL 

Insert into #TempList 
Select * from fn_B(0,'06/06/2006') 

Select * from #TempList 

Я понял, от одного из постов, которые я не могу использовать временные таблицы с одинаковыми именами, если я не inclide в GO. Тем не менее, в том числе GO не принимает параметры, которые я пытаюсь пройти.

Есть ли альтернативный подход для устранения этой ошибки?

+3

Зачем бросать и воссоздавать временную таблицу? Почему бы просто не усечь его? – LittleBobbyTables

ответ

2

На основании введенной процедуры вы можете вместо этого использовать TRUNCATE TABLE.

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

EDIT

Вы не отбрасывать и заново таблицу с тем же именем; вместо этого кода:

If object_id('tempdb..#TempList') is not null drop table #TempList go 
Create Table #TempList (
    MILL_NO VARCHAR(7), 
    SHIP_DATE DATE, 
    BL_STATUS NCHAR(1), 
    FOOTAGE DECIMAL(12,4) 
) 

Просто сделай это:

TRUNCATE TABLE #TempList 
+0

Как я могу создать временную таблицу с тем же именем, если ее не оставить? – rock

+0

Хотя я ценю тот факт, что truncate удаляет данные в моем #table, я не понимаю его концепции для решения моей проблемы. Моя ситуация здесь заключается в том, чтобы вставлять данные во временные таблицы (с тем же именем) из ** двух разных функций (fn_A, fn_B). ** И я не могу этого сделать, потому что мне нужно проверить, является ли @date нулевым или нет вставка. – rock

+0

Почему временные таблицы * имеют * одинаковое имя? – LittleBobbyTables

0

if object_id('tempdb..#TempList') всегда находится NULL, потому что #TempList не имя, что результаты, созданные на sysobjects таблице TempDb, когда вы делаете create table #TempList

EDIT
что об этом:

CREATE PROC PIRULO(@date as DATE) as 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), FOOTAGE DECIMAL(12,4)) 
IF @date IS NULL 
    Insert into #TempList 
    Select mill_no, null, bl_status,footage from fn_A(0,0) 
ELSE 
    Insert into #TempList 
    Select * from fn_B(0,'2006/06/06') -- also I changed date order. 

Select * from #TempList 
+0

, то почему SQL говорит: «В базе уже есть объект с именем« #TempList ».?? – rock

+1

Вторая часть этого ответа верна, но первая часть - нет. 'OBJECT_ID' работает, поскольку OP использует его. –

+0

SQL say 'Уже есть объект с именем #TempList, потому что 'drop table # TempList' не был выполнен, потому что' object_id (' tempdb .. # TempList ') 'был null, потому что' tempdb .. # TempList' не является ссылкой на эту таблицу. –

0

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

Учитывая, что я нахожусь в проекте, переносящем FoxPro (с объявленными курсорами) в SQL Server, эта небольшая логика должна быть реализована в нескольких хранимых процедурах.

Наконец, я узнал об этом - подумайте прямо перед тем, как попробовать что-нибудь другое (предложение моим со-новичкам в миграции БД).

DECLARE @date DATE 

SET @date = '06/06/2006' [email protected] = null 

If object_id('tempdb..#TempList') is not null drop table #TempList 

Create table #TempList (MILL_NO VARCHAR(7), SHIP_DATE DATE, BL_STATUS NCHAR(1), 
FOOTAGE DECIMAL(12,4)) 

If @date = null 

-- Here I am inserting null in place of Ship_Date because fn_A returns only 3 columns in my case 
Insert into #TempList 
Select mill_no, null, bl_status,footage from fn_A(0,0) 

--Select * from #TempList 

else 

Insert into #TempList 
Select * from fn_B(0,@date) 

Select * from #TempList 

Спасибо всем за то, что вы указали свои данные. Надеюсь, это поможет кому-то.

+0

- это не ваш код, в точности то, что я предложил? на самом деле единственным отличием является проверка существования таблицы #TempList. но, будьте уверены, что он избыточен, поскольку временные таблицы имеют область процедур магазина –

+0

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

+0

, то есть другой anwser, я не упоминаю TRUNCATE. вы можете по крайней мере отметить, как хороший anwser, так как вы можете отметить многих андерсеров как «хороший ответ» –

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