C# 用于插入选定数据的SQL Server存储过程
我不熟悉存储过程。在一个过程中,我尝试从一个表中选择数据并将该数据插入另一个表中。例如,下面是我的选择语句:C# 用于插入选定数据的SQL Server存储过程,c#,sql-server,vb.net,stored-procedures,C#,Sql Server,Vb.net,Stored Procedures,我不熟悉存储过程。在一个过程中,我尝试从一个表中选择数据并将该数据插入另一个表中。例如,下面是我的选择语句: 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(ta
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())
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())
然后可以在insert语句中使用@mySum作为要插入的值。当然,只有当查询返回一个值时,这种方法才有效
如果您想从该查询的结果中一次插入多行,您可以执行以下操作
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())
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子句。看看所有这些例子。听起来你真正需要的是一个视图
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故意设置为第二天,以防您的字段是datetime。您知道INSERT语句吗?是的。。。我想尽可能高效地做这件事。。。有什么想法吗?是的。看起来是你想要的。现在在订单日期建立索引应该会提高性能,当然这取决于数据量等。