Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/tfs/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 用于插入选定数据的SQL Server存储过程_C#_Sql Server_Vb.net_Stored Procedures - Fatal编程技术网

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语句吗?是的。。。我想尽可能高效地做这件事。。。有什么想法吗?是的。看起来是你想要的。现在在订单日期建立索引应该会提高性能,当然这取决于数据量等。