【问题标题】:SQL Server : store data from VB.NETSQL Server:存储来自 VB.NET 的数据
【发布时间】:2023-03-18 04:39:02
【问题描述】:

我有一个大问题。我必须在我的 SQL Server 数据库中存储日期时间和值。

我写了一个网站,其中包含一个带有条目的表格。

一个条目包含:日期、时间和一个值

例如:

条目 A : -> 01.01.2014 - 07.06.2014 , 00:00 - 07:15 , 值: 450 条目 A : -> 01.01.2014 - 07.06.2014 , 07:30 - 15:30 , 值: 230 条目 A : -> 01.01.2014 - 07.06.2014 , 15:45 - 23:45 , 值: 300 条目 B : -> 01.01.2014 - 07.06.2014 , 00:00 - 02:15 , 值: 130 条目 B : -> 01.01.2014 - 07.06.2014 , 02:30 - 10:45 , 值: 250 条目 B : -> 01.01.2014 - 07.06.2014 , 11:00 - 23:45 , 价值: 340 条目 C ...

对于范围内的每个日期时间,每步在 15 分钟内存储一个值:

例如,数据库应如下所示:

01.01.2014 00:00:00 | 450 |条目 A 01.01.2014 00:15:00 | 450 |条目 A .. .. 01.01.2014 07:15:00 | 450 |条目 A 01.01.2014 07:30:00 | 230 |条目 A 01.01.2014 07.45:00 | 230 |条目 A .. .. 01.01.2014 15:30:00 | 230 |条目 A 01.01.2014 15:45:00 | 300 |条目 A 01.01.2014 16:00:00 | 300 |条目 A .. .. 01.01.2014 23:45:00 | 300 |条目 A 01.01.2014 07:30:00 | 300 |条目 A .. .. 01.01.2014 07:15:00 | 230 |条目 A 01.01.2014 07:30:00 | 230 |条目 A .. .. 02.01.2014 ...

每个条目和每一天都一样,直到结束。

我认为问题在于插入次数过多。超过五个月,每天每 15 分钟一次,三个条目。

我写了两个脚本,都在工作。但是保存条目需要很长时间。

脚本1:我在VB中直接执行了SQL语句。

 Dim cmd As DbCommand = New SqlCommand()
 cmd.CommandType = Data.CommandType.Text
 Temp2 = DateTime.Parse(DateStart+ " " + TimeStart)
 Temp3 = DateTime.Parse(DateBegin+ " " + TimeBegin)

 While (Temp2 <= Temp3)
       Date = Temp2
       Temp1 = Temp3

       While (Temp <= Temp1)
             cmd.CommandText = "INSERT INTO [dbo].[_Table_Data]([pr_id],[pr_Nr],[Date],[Value],[nvv]) VALUES (" & pr_id & "," & pr_nr & ", '" & Date & "', " & Value & " , '" & Entry &"')"
             cmd.Connection = con
             con.Open()
             Dim dr As SqlDataReader = cmd.ExecuteReader

             While (dr.Read())
                   '    save entrys
             End While

             con.Close()
             Temp = DateAdd(DateInterval.Minute, 15, Temp)
       End While

       Temp2 = DateAdd(DateInterval.Day, 1, Temp2)
  End While

第二个脚本是一个 SQL 过程,我将值和日期发送到一个 SQL 过程。但没有成功,不如第一个脚本。

我也试过 CTE

;with cte as
(
   select DATEADD(MONTH,DATEDIFF(MONTH,0,@StDate),0) as Sdate 
   union all
   select DATEADD(MINUTE,15,SDate) from cte where SDate < @Enddate
)

但在这种情况下,我只有一个开始日期和一个结束日期。如果我必须将 01.01.2014 - 06.06.2014 与一个值一起使用,那效果很好。但是对于不同的时间,我不能使用它。

请帮忙,我需要一个非常快速的解决方案。

【问题讨论】:

  • 不明白你到底想要什么?
  • 在这种情况下,我需要发送超过 30,000 次查询,我需要弄清楚如何才能更快地保存数据。在这种情况下,网站在我存储所有数据之前超时。每天都分为不同的时间段,我必须将这些不同的时间段与每天的值一起存储。在这种情况下,从 01/01/2014 到 07/06/2014 - 00:00 到 07:15,值为 400。这意味着,每天 - 00:00 到 07:15 时钟的值为 400。其余时间time Periode ( 07:30 - 15:30 ) 和 ( 15:45 - 23:45 ) 还有一个值。
  • 一步一步把所有的数据存储起来需要很长时间。网站超时。 :(
  • 哪一点很慢 - 你有没有分析过它?此外,您的 SQL Server 是本地的还是远程的(即网络延迟是一个问题);你有任何聚集索引吗?
  • 另外你为什么要在INSERT 命令上尝试ExecuteReaderr?我通常希望你 ExecuteNonQuery,因为插入(如所写)不会向客户端返回任何行

标签: sql sql-server vb.net stored-procedures common-table-expression


【解决方案1】:

伪代码(对不起,我可以告诉你方法,但我没有时间编写它......)

foreach line ...
    date = first date+time
    enddate = second date+time
    while date >= enddate
        insert into db (please use Parameters)
        date increment by 15 minutes

【讨论】:

  • 这是缓慢的解决方案,例如从 01.01.2014 到 07.06.2014 有 157 天。一个条目有 15072 个插入。看,每一天都分为不同的时间段。在我的示例中,从 00:00 - 07:15 和 07:30 - 15:30 和 15.45 - 23:45 开始,这用于每天相乘条目和相乘值。在最坏的情况下,我有 20 个条目,范围从半年多开始,每天都分为不同的时间范围。这将是超过 200000 条带有“插入”的 SQL 语句
  • 剩下两个选项:第一个:批量插入(也可以在代码中),或者写为 TSQL 过程(我将“SQL-Server”标签读为 MS-SQL Server)
  • 你可以在这里找到它:stackoverflow.com/questions/10731179/…
【解决方案2】:

我刚刚再次尝试了 CTE 的方式。以下代码是我的解决方案,效果很好。 现在我只需要编写一个程序并传递参数。

感谢大家的阅读和支持

declare @StDate datetime = '01/01/2013 00:00.000'
declare @Enddate datetime = '07/07/2043 00:00.000'
declare @stime datetime = '00:00:00'
declare @etime datetime = '23:45:00'

declare @value as int = 387
declare @id as int = 999


;with cte as
(
 select DATEADD(MINUTE,DATEDIFF(Minute,0,@stime),0) as Stime
 union all
 select DATEADD(MINUTE,15,Stime) from cte where Stime < @etime

 ), cte2 as (
 select DATEADD(MONTH,DATEDIFF(MONTH,0,@StDate),0) as Sdate 
 union all
 select DATEADD(day,1,SDate) from cte2 where SDate < @Enddate
 ) 

Insert into [dbo].[_DV_Prognose_Werte_Temp](pr_id,prognosen_Nummer,zeitstempel,[time],leistungsprognose,nvv) (select '1','1',  Combined = CAST(SDate AS DATETIME) + CAST(stime AS DATETIME),stime, @value,'2' from cte cross join cte2)
OPTION (maxrecursion 0)

【讨论】:

    猜你喜欢
    • 2011-08-24
    • 1970-01-01
    • 1970-01-01
    • 2010-10-30
    • 1970-01-01
    • 2013-03-17
    • 2017-03-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多