【发布时间】:2014-09-02 03:51:24
【问题描述】:
我正在使用 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 新手,所以这可能很明显,但我看不出来,一切对我来说似乎都是为了。
编辑1:
所以这是我知道的代码,按照建议升级:
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
但这给了我以下错误:
“无效的列名‘池’”
仅供参考,表 Vsp_Pool 和 temp 中都存在池。
【问题讨论】:
-
我将从使用一些最佳实践开始 - 完全限定您的对象(database.schema.temp、database.schema.vsp_pool),列出您的插入列(
INSERT INTO database.schema.temp (pool, endUsedCapacityInKB, startUsedCapacityInKB) SELECT ...),并使用临时表:CREATE TABLE #Temp... -
另一件事。这是在一个过程中,您正在创建一个持久表。此过程将在第二次运行时失败,因为表 temp 已经存在。我建议将其更改为临时表。创建表#temp...
-
我刚刚注意到你也把桌子放在了最后。啊!!!不需要持久表甚至临时表。只需在单个 select 语句中选择您想要的数据。
-
就像我说的,这是一个非常简化的代码版本,我不能在一个语句中选择所有我想要的。我将需要使用另一个软件对列进行计算,并且基于我对 SQL 的所有了解(我承认这一点并不多),我想要执行的计算无法用 SQL 完成。所以我宁愿像这样在表格中保留列并从那里开始工作。
-
@user3779627,在任何情况下都不要在存储过程中创建永久表。这只是一个不好的做法。学习使用临时表。
标签: sql-server sql-server-2008 insert while-loop do-while