2015-01-29 3 views
1

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

SELECT SUM((qty_invoiced * price)) FROM table1,table2 
WHERE table1.co_num = table2.co_num 
AND UPPER(table2.strIDX) = 'S' 
AND DATEPART(wk,table1.order_date) = DATEPART(wk,Getdate()) 
AND YEAR(table1.order_date) = YEAR(Getdate()) 

Затем я хочу вставить значение поля суммы в другую таблицу.

Как я могу сделать это наиболее эффективным способом с помощью SQL Server. Я могу сделать это в .net-коде (C#, VB и т. Д.), Но хотел бы сделать это более эффективно с помощью хранимой процедуры.

+3

Вы знаете о заявлении 'INSERT'? –

+0

Да ... Я хотел сделать это максимально эффективно ... любые идеи? –

+0

Да. Похоже, вы хотите [вставлять данные из других таблиц] (https://technet.microsoft.com/en-us/library/dd776381 (v = sql.100) .aspx # OtherTables). –

ответ

1

Вы можете сделать это несколькими способами. Вы ожидаете, что запрос вернет одну строку или несколько строк?

Если вы ожидаете его вернуть одну строку, возможно, самый прямой способ будет, чтобы сохранить значение в какой-либо переменной, как это ...

DECLARE @mySum DECIMAL 

SELECT @mySum = SUM((qty_invoiced * price)) 
FROM table1,table2 
WHERE table1.co_num = table2.co_num 
AND UPPER(table2.strIDX) = 'S' 
AND DATEPART(wk,table1.order_date) = DATEPART(wk,Getdate()) 
AND YEAR(table1.order_date) = YEAR(Getdate()) 

И тогда вы можете использовать @ mySum в инструкции insert в качестве значения для вставки. Это, конечно, работает, только если у вас есть одно значение, возвращаемое из запроса.

Если вы хотите вставить несколько строк сразу из результатов этого запроса, вы могли бы сделать что-то вроде этого ...

INSERT INTO SomeTable 
(TheSumColumn) 
SELECT SUM((qty_invoiced * price)) 
FROM table1,table2 
WHERE table1.co_num = table2.co_num 
AND UPPER(table2.strIDX) = 'S' 
AND DATEPART(wk,table1.order_date) = DATEPART(wk,Getdate()) 
AND YEAR(table1.order_date) = YEAR(Getdate()) 

Или вы можете использовать SELECT INTO пункта. Посмотрите на «Adding Rows by Using INSERT and SELECT» на примерах всех этих.

+0

спасибо .... что помогло –

0

Это звучит так, как будто вам действительно нужен вид.

CREATE VIEW vWeeklySum 
as 
SELECT 
YEAR(table1.order_date) as [Year], 
DATEPART(wk,table1.order_date) as [WeekNo], 
SUM(qty_invoiced * price) [Total] 
FROM table1 
JOIN table2 
ON table1.co_num = table2.co_num 
WHERE UPPER(table2.strIDX) = 'S' 
GROUP BY YEAR(table1.order_date), 
DATEPART(wk,table1.order_date) 

Таким образом, если ваши исходные данные изменятся, ваш вид изменится, если вам не нужно ничего делать. Тогда вы могли бы использовать его как:

SELECT [Total] 
FROM vWeeklySum 
WHERE [Year] = 2015 
AND [WeekNo] = 5 

Если вы все еще хотите, чтобы сохранить его в виде таблицы (моментальный снимок), хранимая процедура будет выглядеть примерно так:

CREATE PROC SaveWeek(DateTime @Date) 
AS 

DELETE FROM myTable 
WHERE WeekNo = DATEPART(wk,@Date) 
AND [Year] = YEAR(@Date) 

INSERT INTO myTable 
([Year], WeekNo, [Total]) 
SELECT 
YEAR(@Date), 
DATEPART(wk,@Date), 
SUM(qty_invoiced * price) 
FROM table1 
JOIN table2 
ON table1.co_num = table2.co_num 
WHERE UPPER(table2.strIDX) = 'S' 
AND DATEPART(wk,table1.order_date) = DATEPART(wk,@Date) 
AND YEAR(table1.order_date) = YEAR(@Date) 
GROUP BY YEAR(@Date), 
DATEPART(wk,@Date) 

Тогда вы могли бы назвать его с

DateTime @now 
set @now = getdate() 
exec SaveWeek @now 
0

Если вы хотите, чтобы быть эффективным, вы никогда не должны использовать функции для полей Sarg, так что вы должны сделать что-то вроде этого:

INSERT INTO table3 
SELECT SUM((qty_invoiced * price)) 
FROM table1 t1,table2 t2 
WHERE t1.co_num = t2.co_num 
AND t2.strIDX in ('s','S') 
AND t1.order_date >= @startdate 
AND t1.order_date < @enddate 

Вычислите правильные значения переменных перед оператором. @enddate преднамеренно на следующий день, на случай, если ваше поле будет дата и время.

+0

Теперь, имея указатель на order_date, следует улучшить производительность, в зависимости от количества данных и т. Д. –

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