SQL 用于插入所选数据的服务器存储过程

SQL Server Stored Procedure to insert selected data

本人是存储过程新手,多多包涵。在单个过程中,我试图从 table 中 select 数据并将该数据插入另一个 table。例如,这是我的 selection 语句:

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

然后我想将求和字段的值插入另一个 table。

我将如何以最有效的方式使用 SQL Server 来做到这一点。我可以在 .net 代码(C#、VB 等)中完成,但想使用存储过程更有效地完成它

您可以通过多种方式做到这一点。您希望查询 return 单行还是多行?

如果您希望它成为 return 单行,也许最直接的方法是将值保存到某个变量中,就像这样...

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 作为要插入的值。这当然只有在您从查询中获得单个值 return 时才有效。

如果您想从该查询的结果中一次插入多行,您可以这样做...

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”以获取所有这些示例。

听起来您真正需要的是视图。

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

如果您仍想将其保存到 table(快照),您的存储过程将类似于:

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 是故意在第二天,以防万一你的字段是日期时间。