2014-09-02 32 views
0

,我試圖運行它,但我不斷收到是是否存在正確,我需要一些幫助,這查詢不工作

"There is already an object named '#PreFixedData1' in the database." 

能否請您對解決方法建議,這樣的數據將通過使用嵌套的IF Exists語句進入?我也嘗試在第一個IF EXISTS之後使用ELSE IF EXISTS,但我得到相同的錯誤。

CREATE TABLE dbo.PostPivotTbl (
TestDate VARCHAR(100) 
); 

GO 

INSERT INTO dbo.PostPivotTbl 
VALUES ('17/Jul/2014'), 
'10/May/2014') 



IF EXISTS (
SELECT TestDate 
FROM dbo.PostPivotTbl 
WHERE TestDate LIKE '[1-9]%' AND TestDate NOT LIKE '0%' AND TestDate NOT LIKE '%/%' 
) 

BEGIN 

IF OBJECT_ID('tempdb..#PreFixedData1', 'u') IS NOT NULL DROP TABLE #PreFixedData1 

SELECT 
CAST(TestDate AS INT) AS 'TestDate' 
INTO #PreFixedData1 
FROM dbo.PostPivotTbl 

END 

ELSE 

    BEGIN 


     IF EXISTS(

      SELECT TestDate 
      FROM dbo.PostPivotTbl 
      WHERE TestDate 
    LIKE '%2013%' AND TestDate LIKE '%-%' OR TestDate LIKE '%2014%' AND TestDate LIKE '%-%' 

    OR 
     TestDate LIKE '%2013%' AND TestDate LIKE '%/%' OR TestDate LIKE '%2014%' AND  
     TestDateLIKE '%/%' 
    OR TestDate LIKE '%2012%' AND TestDate LIKE '%/%' 
    OR 
TestDate LIKE '%Jan%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Feb%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Mar%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Apr%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%May%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Jun%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Jul%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Aug%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Sep%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Oct%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Nov%' AND TestDate LIKE '%-%' 
OR 
TestDate LIKE '%Dec%' AND TestDate LIKE '%-%' 
) 

BEGIN 

IF OBJECT_ID('tempdb..#PreFixedData1', 'u') IS NOT NULL DROP TABLE #PreFixedData1 


SELECT 
CAST(TestDate AS DATETIME) AS 'TestDate' 
INTO #PreFixedData1 
FROM dbo.PostPivotTbl 

    END 
END 
+0

的[我如何有條件地建立在Sybase(TSQL)?一個表(可能重複http://stackoverflow.com/questions/307942/how- do-i-conditionally-create-a-table-in-sybase-tsql) – ninesided 2014-09-02 09:23:29

+0

或可能的[this]重複(http://stackoverflow.com/questions/12408599/t-sql-with-if-logic-not - 工作與臨時表?rq = 1) – ninesided 2014-09-02 09:28:33

+0

@nidesided - 不是,這傢伙的問題是不同的,他無法創建一個表,我創建的表,只是不能從數據中查詢數據是在... – Claudio 2014-09-02 09:34:11

回答

3

這是什麼做的EXISTS條款(這看起來非常凌亂的方式),它與SQL Server編譯語句的方式做。您可以重新創建此簡單地用:

IF 1 = 0 
BEGIN 
    SELECT Col = 1 
    INTO #T; 
END 
ELSE 
BEGIN 
    SELECT Col = 2 
    INTO #T; 
END 

這給錯誤:

There is already an object named '#T' in the database.

即使只有一個IF語句的分支可以每天跟隨,SQL Server編譯他們兩個,所以當它編譯它建立的第二個分支#T將存在,因此會引發編譯錯誤。

工作以防萬一是一次創建表,並使用INSERT [Table] SELECT..

CREATE TABLE #PreFixedData1 (TestDateInt INT, TestDate DATETIME); 

IF ... 
    INSERT #PreFixedData1 (TestDateInt) 
    SELECT .... 

ELSE 
    INSERT #PreFixedData1 (TestDate) 
    SELECT ... 

它超出了問題的範圍,但我不知道你爲什麼會創建一個列,它是VARCHAR(100),然後給它插入日期。保持日期和日期,那麼你不需要做各種奇怪的比較來確定它是否是有效的日期。我也不確定爲什麼要有條件地創建同一個表,但使用列的不同數據類型,具體取決於表中的數據。

作爲再一不談,使用string literals as column aliases is on the deprecation listSELECT Column AS 'Alias'

+0

我想找到一種不同的方式來轉換數據類型,最初來自一個excel文件,這將有日期時間列V ARCHAR或NVARCHAR,這是抵消上週遇到的優先數據類型問題的一種方法。順便說一下,我看到你和我一樣在曼徹斯特:D很酷的東西,我現在也試試你的解決方案,並讓你知道它是怎麼回事,謝謝。 – Claudio 2014-09-02 09:41:34

+0

您使用的是哪個版本的SQL Server? – GarethD 2014-09-02 09:50:14

+0

工作了一個治療夥伴,稍微修改了你的解決方案,但它確實有效,謝謝你的提示! – Claudio 2014-09-02 09:53:45