2014-07-11 2 views
0

Я использую SQL Server 2008 и хочу создать процедуру, которая просто берет данные из одной таблицы и вставляет ее в другую таблицу. Вот то, что я до сих пор:Что случилось с моим заявлением INSERT? 44

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 

Но это потом дает мне ошибку folowwing:

«Неверное имя столбца 'пул' "

Только FYI, пул присутствует в таблице Vsp_Pool, а также в temp.

+0

Я бы начал с использования некоторых лучших практик - полностью квалифицируйте свои объекты (database.schema.temp, database.schema.vsp_pool), перечислите свои столбцы вставки ('INSERT INTO database.schema.temp (пул, endUsedCapacityInKB, startUsedCapacityInKB) SELECT ... ') и используйте временную таблицу:' CREATE TABLE #Temp ... ' –

+1

Еще одна вещь. Это процедура, и вы создаете постоянную таблицу. Эта процедура завершится неудачей во второй раз, поскольку она будет существовать. Я бы рекомендовал изменить это на временную таблицу. create table #temp ... –

+0

Я просто заметил, что вы также бросаете стол в конце. Тьфу !!! Не требуется постоянная таблица или даже временная. Просто выберите нужные данные в одном операторе select. –

ответ

0

вам нужно указать имена столбцов в инструкции «вставить в».

INSERT INTO temp (poolVal, maxcapacity, maxfreecapacity) 

может помочь дать имена столбцов в некоторых псевдонимах заявления, как в моем примере. #

бассейн ключевого слова использовать что-нибудь другое для вашего имени поля.

+1

На самом деле, хотя это, безусловно, самая лучшая практика, это технически не требуется. Я должен был проверить это, чтобы убедиться, но я смог вставить без указания имен столбцов. –

+0

Если я это сделаю, я получаю «синтаксическую ошибку рядом с ключевым словом WHERE» – user3779627

+0

@ Dave.Gugg, это необходимо, если есть больше столбцов, чем те, которые он добавляет (столбцы, которые будут пустыми). И это то, что я никогда не пройду в обзоре кода в любом случае. Вы должны быть в состоянии сказать, что столбец, который вы выполняете, точно совпадает с колонкой, в которую вы вставляете. Нельзя безответственно писать вставку, в которой вы не указываете столбцы. У вас будут проблемы с целостностью данных, если вы это сделаете, и это выходит далеко за рамки лучшей практики. – HLGEM

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 
+0

Я думаю, что цикл прекрасен, так как я уменьшаю значение @end после каждой итерации цикла с помощью SET – user3779627

+0

Просто проверьте с помощью решения – jainvikram444

-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 заявление. Также обратите внимание, что я запрашиваю результат запроса и полностью исключаю таблицу temp. Вынос здесь - начать думать в наборах. Если запрос кажется, что вы проходите, и атомизированное обновление каждой записи индивидуально, а не как набор, вероятно, лучший, оптимизированный SQL способ перезаписи.

+0

хорошо для кода примера. У меня здесь вы правы, это было бы лучше, но для то, что я должен делать, не будет. Как я уже сказал, я просто упростил код, чтобы узнать свою ошибку в INSERT, но я попробовал BETWEEN (это была моя первая мысль), но это не то, что я намереваюсь. – user3779627

+0

Тогда я бы предпочел использовать имена столбцов в инструкции INSERT, такие как @ user3195030, а затем изменить опечатку в инструкции WHERE. Я уверен, что «dateCollecte» должен быть «dateCollected», я ошибаюсь? – cephalopodMD

+0

Кроме того, возможно, изменить инструкцию IN на два оператора равенства 'WHERE dateCollected == DATEADD (день, -1, @end) ИЛИ dateCollected == @ end' – cephalopodMD

Смежные вопросы