我的INSERT语句有什么问题? 44

时间:2014-07-11 13:38:08

标签: sql-server sql-server-2008 insert while-loop do-while

我正在使用SQL Server 2008,并希望创建一个只从一个表中获取数据并将其插入另一个表的过程。以下是我到目前为止的情况:

CREATE PROCEDURE consomVspPools (@start DATE, @end DATE)
AS
CREATE TABLE dbo.temp (pool NVARCHAR (250), endUsedCapacityInKB FLOAT, 
                         startUsedCapacityInKB FLOAT)
WHILE (@end >= @start)
BEGIN
      INSERT INTO temp
      SELECT pool, MAX(capacityInKB), MAX(freeCapacityInKB)
      FROM Vsp_Pool
      WHERE dateCollecte IN (DATEADD(day, -1, @end), @end)
      GROUP BY pool
      SET @end = DATEADD(day, -1, @end)
END
SELECT *
FROM temp
DROP TABLE dbo.temp

我现在知道代码并没有真正做多少,但我必须简化它以缩小我的错误(这对我没有多大帮助)。我得到的错误是:

“列名或提供的值数与表定义不匹配”

我是SQL的新手,所以这可能很明显,但我没有看到,一切似乎都是为了我。

EDIT1:

所以这是我知道的代码,按建议升级:

CREATE PROCEDURE consomVspPools (@start DATE, @end DATE)
AS
CREATE TABLE #dbo.temp (pool NVARCHAR (250), endUsedCapacityInKB FLOAT, 
                      startUsedCapacityInKB FLOAT)
WHILE (@end >= @start)
BEGIN
      INSERT INTO temp (pool, endUsedCapacityInKB, startUsedCapacityInKB)
      SELECT pool, MAX(capacityInKB), MAX(freeCapacityInKB)
      FROM Vsp_Pool
      WHERE dateCollecte IN (DATEADD(day, -1, @end), @end)
      GROUP BY pool
      SET @end = DATEADD(day, -1, @end)
END
SELECT *
FROM temp
DROP TABLE #dbo.temp

但是这给了我以下错误:

“无效的列名称'pool'”

只是FYI,池存在于表Vsp_Pool以及temp。

3 个答案:

答案 0 :(得分:0)

您需要在"中插入列名称"言。

INSERT INTO temp (poolVal, maxcapacity, maxfreecapacity)

可能有助于在select语句中给出列名,就像我的例子中一样。#

pool是一个关键字,使用其他任何字段名称。

答案 1 :(得分:0)

Put if condition because while is in infinite loop:


CREATE PROCEDURE consomVspPools (@start DATE, @end DATE)
AS
CREATE TABLE dbo.temp (pool NVARCHAR (250), endUsedCapacityInKB FLOAT, 
                         startUsedCapacityInKB FLOAT)
if (@end >= @start)
BEGIN
      INSERT INTO temp
      SELECT pool, MAX(capacityInKB), MAX(freeCapacityInKB)
      FROM Vsp_Pool
      WHERE (dateCollecte >= (DATEADD(day, -1, @end)) and  (dateCollecte <= @end)
      GROUP BY pool
      SET @end = DATEADD(day, -1, @end)
END
SELECT *
FROM temp
DROP TABLE dbo.temp

答案 2 :(得分:-1)

您可能听说过SQL是一种声明性语言,而不是程序性语言。这意味着您应该而不是说如何做某事,而是声明你想要做什么。 SQL引擎针对此行为进行了优化。由于这个原因,通常不使用WHILE语句。不知道你的数据库结构,我最好的猜测是,你应该尝试这样的事情:

CREATE PROCEDURE consomVspPools (@start DATE, @end DATE)
AS

BEGIN
    SELECT *
    FROM
        (
        SELECT dateCollecte, pool, MAX(capacityInKB), MAX(freeCapacityInKB)
        FROM Vsp_Pool 

        -- Is "dateCollecte" a typo? Might be your issue.
        WHERE dateCollecte BETWEEN @start AND @end
        GROUP BY dateCollecte, pool
        )
END

查看BETWEEN声明。另请注意,我正在查询查询结果并完全避开临时表。这里的内容是开始思考。如果一个查询感觉你正在经历并原子地更新每个条目而不是作为一个集合,那么可能有一种更好的SQL优化方式来重写它。