2014-09-02 52 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