使用c#和一个连接在sql命令中持久化变量

hwamh0ep  于 2021-07-24  发布在  Java
关注(0)|答案(2)|浏览(257)

所以也许有人能给我指出正确的方向。
我有一个巨大的sql查询,一个.net应用程序正在运行(我将尽力解释,因为我不能发布代码)。
我决定做的是分解查询,这样数据库就不会出现死锁。
长话短说,有没有办法保持所有的变量

Declare @sometable as Table

因为每个 SqlCommand 在它之前需要来自查询的信息和id。
这是使用相同的连接。我已经做了4天了,我的头都快转过来了。
下面是我的一些代码,我尝试使用相同的命令并更改查询文本

foreach (var query in querys)
{
 command.CommandText = query;
 DataSet ds = new DataSet();
  try {
var reader = command.ExecuteReader();

while (!reader.IsClosed)
ds.Tables.Add().Load(reader);
mergedResults.Add(ds);
 }

编辑:这里有一个示例,说明了在任何地方都需要使用r

DECLARE @dbID int;
DECLARE @idDomain int;
DECLARE @DomainName varchar(255);

DECLARE @IdDrivers TABLE
(
 idDriver int,
 startTime datetime,
 endTime dateTime
);
pbwdgjma

pbwdgjma1#

任何以 @ (局部变量、参数、表值参数等)都限定在一个sql批处理中,因此不能:它们不能在批处理之间持久化。有 # 临时表的作用域是连接,但这听起来不是一个好的解决方案。减慢速度并不会改变死锁行为,因为锁定语义是每个操作的,而不是每个批处理的——除非您有一个跨事务,在这种情况下会产生影响。无论哪种方式:批次数都不是决定因素。
如果你遇到了僵局,你需要调查一下原因和方法。可能是执行某些读取(之后是对相同数据的更新)时 UPDLOCK 可能会有帮助,通过采取排他锁更快。

x4shl7ld

x4shl7ld2#

如果要跨批持久化表变量:
您可以使用临时表(#iddrivers),而不是表变量@iddrivers。在第一批中创建此临时表。
例如。:

if object_id('tempdb..#IdDrivers') is not null drop table #IdDrivers

create table #IdDrivers (your required columns here)

然后第二批可以填充temp表,随后的批可以从中读取。
只要您在第一批之前打开sql连接,在最后一批执行之后关闭它,这应该是可行的。
您可能需要创建另一个#temp表来存储变量,例如:@iddomain。
重要的是,创建临时表的批处理不能在后台通过sp\u executesql执行,否则,由于范围限制,后续批处理将无法看到您创建的临时表。e、 如果您试图传递参数,那么ado.net将在幕后使用sp_executesql,因此不要将参数传递给创建临时表的sql。

相关问题