我必须为大量记录(数百或数千,取决于用户选择)运行相同的存储过程。该过程相当基本:在两个单独的表中插入一条记录,其中包含一些计算值,并可选择更新第三个表上的两列。
我的应用程序有一个List<T>记录,我正在尝试决定是否应该遍历列表并在每条记录上运行该过程,或者将 id 值组合成单个字符串并进行单个数据库调用。如果我进行单个数据库调用,那么 SQL 将负责将逗号分隔的字符串转换为临时表并同时在所有记录上运行脚本。
我倾向于将逗号分隔的 Id 字符串传递给程序,但我不确定这是否是进行这种大规模更新的理想方式,或者我是否遗漏了一些会影响此决定的关键因素.
在决定是否应该将逗号分隔的 id 字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?或者有没有更有效的方法来从应用程序进行这种更新?
我正在使用 SQL Server 2005 和实体框架
performance sql-server-2005 stored-procedures entity-framework
我首先使用 C# 实体框架代码。
我对数据库的了解几乎一无所有。我不知道这是常见的还是好的做法,所以我想问你们我应该怎么做。
假设我有一张字母表和一张车站表。
我开发了一个应用程序,可以将信件从一个站发送到其他站。每封信都可以发送到不同的站点——这是一种多对多的关系。
发送的每封信都与一个站相关联 - 信的源站(信不能发送到它自己的源站,等等)。
每个数据库实例代表一个站。
在应用程序启动时,我知道哪个站是我的源站,并希望将该信息保存在数据库中。
我应该如何保存哪个站是源站?我是否应该在每一行的站台表中都有一个标志,指示它是否是当前实例站?这对我来说听起来很糟糕。
有没有办法让表格只有 1 个值?例如,它将被称为 InstanceStation,它将只包含一行和一列 - StationId?这是一个好习惯吗?
我尽量说清楚,希望我的情况清楚。
database-design sql-server entity-framework c# sql-server-localdb
我有一个 SQL Server 从 SP 内的链接 Oracle 服务器获取数据。
在我的开发服务器上,EF6 坚持 SP 正在返回double其中一列的数据类型,但在 prod 中,它坚持同一列是decimal.
SQL Server 版本略有不同:
链接服务器的配置方式没有(明显的)差异(即我比较了 SSMS 中的连接属性)。
作为一个新功能,生产数据库在数据库中只有很少(零,偶数)行,而开发服务器有很多。我有一种感觉可能是相关的,因为我记得必须在开发过程中更改数据类型(尽管当时我并没有考虑太多)。
这里可能有什么问题?
我有 TBV 功能。像这样
ALTER FUNCTION [dbo].[fn_Functiont]
(
@accessibleIds ListAccesableIds READONLY
)
RETURNS TABLE
AS
RETURN
(
SELECT d.*, b.Name AS Name, ps.Name AS PaymentSystemName, c.UserName AS UserName, c.FirstName AS ClientFirstName, c.LastName AS LastName, c.Number AS DocumentNumber, c.Id
FROM Document AS d
JOIN System AS ps ON d.SystemId = ps.Id
JOIN Client AS c ON c.Id = d.ClientId
LEFT JOIN Shop AS b ON b.Id = d.ShopId
WHERE d.OperationTypeId IN (2, 4, 5) AND c.Type = 1
)
Run Code Online (Sandbox Code Playgroud)
我想传递给这个包含整数的函数列表。我想创建表值类型,但这里的问题是我如何将 List 输入参数传递给函数?我知道我可以通过 …
sql-server entity-framework functions sql-server-2014 table-valued-parameters
在内存 OLTP 表中访问实体框架是否有任何限制?或者这是不可能的?
sql-server entity-framework in-memory-database memory-optimized-tables sql-server-2016
我有一种感觉,答案是“这取决于……”,但我想知道是否有具体的答案。
在实体框架中,您使用 C# 代码构建查询,框架将转换为 SQL 并发送到服务器以下拉数据。假设我想从三个表中检索一条记录。我至少有三个选择:
使用直接 SQL(手动 ADO.NET),SELECT在同一命令中发送三个语句,并使用 DataReader 一次映射一个结果集。从数据库的角度来看,这显然是最好的方法,但它是最有效的方法,因为我无法使用实体框架方法。
从实体框架发送三个单独的命令 - 这需要到数据库服务器的三个往返:
Person person1 = context.Persons.First(p => p.PersonID == 1);
Car car1 = context.Cars.First(c => c.CarID == 1);
House house1 = context.Houses.First(h => h.HouseID == 1);
// translates to the following SQL, one roundtrip at a time:
SELECT TOP(1) [p].[PersonID], [p].[PersonName] FROM [Person] AS [p] WHERE [p].[PersonID] = 1
SELECT TOP(1) [c].[CarID], [c].[CarName] FROM [Car] AS [c] WHERE [c].[CarID] = 1
SELECT TOP(1) [h].[HouseID], [h].[HouseName] FROM …Run Code Online (Sandbox Code Playgroud) 我应该使用脚本从表中获取最大值。它应该看起来像这样
BEGIN
DECLARE @MaxID AS INT
SELECT @MaxID = MAX([Id]) FROM dbo.suggestion
Insert into suggestion
values(@MaxID+ 1, 'value', 1);
END
Run Code Online (Sandbox Code Playgroud)
相反,由于一些错误,它是这样的
BEGIN
DECLARE @MaxID AS INT
SELECT @MaxID = [Id] FROM dbo.suggestion
Insert into suggestion
values(@MaxID+ 1, 'value', 1);
END
Run Code Online (Sandbox Code Playgroud)
到目前为止,它运行良好,由于当我们开始深入研究时出现了其他一些问题,然后它就暴露出来了。
我想知道到目前为止它是如何运作的。
如果有人分享他们的知识,我们将不胜感激
TIA
我有一个 SQL 服务器数据库,其中有一列名为“时间”的格式为“日期时间”。
在 C# 实体框架中,我想获取日期在今天上午 8 点之后的所有行:
using (var db = new intrabaseEntities())
{
var getQ = db.intrads.Where(s => s.Time.Value.TimeOfDay >= TimeSpan.Parse("8:00") & s.Time >= DateTime.Now.Date);
foreach (var x in getQ)
{
MessageBox.Show(x.ToString());
}
}
Run Code Online (Sandbox Code Playgroud)
代码在编译器中没有显示错误,但抛出异常:
System.NotSupportedException {“LINQ to Entities 不支持指定的类型成员‘TimeOfDay’。仅支持初始值设定项、实体成员和实体导航属性。”}
如何让查询选择日期在今天上午 8 点之后的所有值?
此代码检索今天日期的行,但我还需要按今天上午 8 点之后的白天进行区分:
var getQ =
db.intrads.Where(s => DbFunctions.TruncateTime(s.Time) == DbFunctions.TruncateTime(DateTime.Today));
Run Code Online (Sandbox Code Playgroud)