INTO关键字上的错误消息

Mr *_*017 0 sql sql-server sql-server-2014

有谁知道为什么INTO关键字在下面的第一个方法中工作,但不是第二个?

我在本视频的前5分钟内获得了关于创建临时表的两种方法:https://www.youtube.com/watch?v = 3ZtYrELHP8M

方法1

SELECT 
    CAST (date AS DATE) AS #DateWk  
INTO
    #DateWk  
FROM
    AggregatedSalesHistory
WHERE 
    date >= '1-2-2014' 

SELECT * FROM #DateWk
Run Code Online (Sandbox Code Playgroud)

当我尝试方法2时,我收到以下错误消息:

关键字"INTO"附近的语法不正确.

这是方法2的代码:

CREATE TABLE #DateWeek
(   
    Title VARCHAR(MAX),
    ReleaseDate DATETIME
)

INSERT INTO #DateWk
    SELECT 
        CAST (date AS DATE) AS #DateWk,  
    INTO #DateWk  
    FROM AggregatedSalesHistory
    WHERE date >= '1-2-2014' 

SELECT * FROM #DateWk
Run Code Online (Sandbox Code Playgroud)

mar*_*c_s 5

如果表已经存在,则不SELECT .... INTO ....能再使用- 您需要使用:

INSERT INTO #DateWk
    SELECT CAST (date AS DATE)   
    FROM AggregatedSalesHistory
    WHERE date >= '1-2-2014' 
Run Code Online (Sandbox Code Playgroud)

你已经指定INSERT INTO在开始-做添加INTO ..SELECT,然后它应该工作得很好.

所以,如果你这样做

SELECT (list of columns)
INTO SomeTable
FROM ....
WHERE..... 
Run Code Online (Sandbox Code Playgroud)

然后这SELECT将自动创建SomeTable表 - 但如果已经存在,此代码将失败SomeTable - 在这种情况下使用:

INSERT INTO SomeTable(list-of-columns)
    SELECT (list of columns)
    FROM ....
    WHERE..... 
Run Code Online (Sandbox Code Playgroud)

更新:通常认为总是明确指定要插入的列是一种好习惯- 以避免像现在这样的问题.

所以将你的陈述改为:

INSERT INTO #DateW (ReleaseDate)
    SELECT CAST (date AS DATE) 
    FROM AggregatedSalesHistory  
    WHERE date >= '1-2-2014' 
Run Code Online (Sandbox Code Playgroud)

如果INSERT语句中指定表名后面的列列表,则必须为表的所有列提供值- 按它们在表中显示的顺序.