簡體   English   中英

SQL Server存儲過程可插入所選數據

[英]SQL Server Stored Procedure to insert selected data

我不熟悉存儲過程。 在一個過程中,我試圖從一個表中選擇數據並將該數據插入另一個表中。 例如,這是我的選擇聲明:

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()) 

然后,我想將sum字段的值插入另一個表。

我將如何使用SQL Server以最有效的方式做到這一點。 我可以用.net代碼(C#,VB等)執行此操作,但希望通過存儲過程更有效地執行此操作

您可以通過多種方式執行此操作。 您是否希望查詢返回單行或多行?

如果您期望它返回單行,則最直接的方法可能是將值保存到某個變量中,如下所示...

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 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子句。 有關所有這些示例,請參見使用INSERT和SELECT添加行 ”。

聽起來您真正需要的是視圖。

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

如果您想提高效率,則永遠不要對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故意是第二天,以防萬一您的字段是日期時間。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM