2016-03-30 13 views
-1

私はMS SQL Serverを使用しています。私は現在、人員を引き出すためのクエリに取り組んでいます。このプロセスでは、テンポラリテーブルを作成していますが、クエリを1回しか実行できないことに気付きました。変更した後にもう一度実行しようとすると、データベースに「#Test1」という名前のオブジェクトが既に存在します。複数の時刻に実行する一時テーブルを取得する方法

私のSQLは次のようになります。

SET NOCOUNT ON SET ANSI_WARNINGS OFF  
IF OBJECT_ID('Tempdb..#Headcount') IS NOT NULL 
Drop Table #Test1 
Select Coalesce(Enddate,GETDATE()) as EndDate1,FirstName,LastName,EmployeeID,CostCenter,JobCode, CompanyCode 
Into #Test1 
from EmployeeDM.dbo.vEmployeeJobReporting EJ 
--Group By FirstName,LastName,EmployeeID,CostCenter 
Order by 1 

IF OBJECT_ID('Tempdb..#Headcount') IS NOT NULL 
Drop Table #Final1 
Select max(EndDate1) as Date1, FirstName,LastName,EmployeeID,CostCenter,JobCode, CompanyCode 
Into #Final1 
From #Test1 
Group by FirstName,LastName,EmployeeID,CostCenter,JobCode, CompanyCode 
Order by 1 

SELECT F.CostCenter,F.FirstName,F.LastName, F.Date1, F.CompanyCode, F.JobCode,F.EmployeeID,(t3.Day_of_Month-t2.Day_of_Month+1)*1.0/t4.Day_of_Month as Headcount, 

     Case 

最後のSelectステートメントは、非一時テーブルクエリの開始です。行を複数回実行できるようにするには、何をすればいいのですか?また、私が受け取っているエラー:

メッセージ2714、レベル16、状態6、行4 データベースにはすでに '#Test1'という名前のオブジェクトがあります。

ありがとうございます!

+0

まあ、#Headcountが存在する場合に限り、最初のチェックで#Test1が削除されます。おそらくそれは問題ですか?あなたは#Final1のために同じことをやり直します。 –

+0

ちょっとした提案...あなたは本当に順序の代わりに列の名前で注文するべきです。あなたが注文を間違っているため、あなたがあなたのクエリを変更すると間違ったデータを取得する可能性があります。 –

+0

提案をよろしくお願いします!はい、それは問題の一部でした。 –

答えて

0

... INTO#test1を記述すると、select文の内容に基づいてテーブルが作成されます。 1)クエリの最後に一時テーブルを削除するか、2)フロントエンドに存在するかどうかをチェックし、存在する場合はドロップするか、3)両方を行う必要があります。

すでに#headcountがチェックされていますが、最初に#finalと#test1を削除しています。私はテーブルとして#headcountを宣言している場所を見ていませんか?

+0

それは基本的に問題でした。 SQLの新機能助けてくれてありがとう! –