所以也许有人能给我指出正确的方向。
我有一个巨大的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
);
2条答案
按热度按时间pbwdgjma1#
任何以
@
(局部变量、参数、表值参数等)都限定在一个sql批处理中,因此不能:它们不能在批处理之间持久化。有#
临时表的作用域是连接,但这听起来不是一个好的解决方案。减慢速度并不会改变死锁行为,因为锁定语义是每个操作的,而不是每个批处理的——除非您有一个跨事务,在这种情况下会产生影响。无论哪种方式:批次数都不是决定因素。如果你遇到了僵局,你需要调查一下原因和方法。可能是执行某些读取(之后是对相同数据的更新)时
UPDLOCK
可能会有帮助,通过采取排他锁更快。x4shl7ld2#
如果要跨批持久化表变量:
您可以使用临时表(#iddrivers),而不是表变量@iddrivers。在第一批中创建此临时表。
例如。:
然后第二批可以填充temp表,随后的批可以从中读取。
只要您在第一批之前打开sql连接,在最后一批执行之后关闭它,这应该是可行的。
您可能需要创建另一个#temp表来存储变量,例如:@iddomain。
重要的是,创建临时表的批处理不能在后台通过sp\u executesql执行,否则,由于范围限制,后续批处理将无法看到您创建的临时表。e、 如果您试图传递参数,那么ado.net将在幕后使用sp_executesql,因此不要将参数传递给创建临时表的sql。