gpt4 book ai didi

sql-server - 一批语句中受SQL影响的行数

转载 作者:行者123 更新时间:2023-12-03 18:50:22 24 4
gpt4 key购买 nike

我在循环中运行以下一批语句,直到受影响的行数返回为0:

DECLARE @ScopeTable TABLE (  KeyField bigint,  PRIMARY KEY ( KeyField ) )

INSERT INTO @ScopeTable
SELECT DISTINCT DocumentID FROM [CurrentArchive].[dbo].[ItemData]
WHERE DocumentID IS NOT NULL

INSERT INTO [CurrentArchive].[dbo].[ItemExtras]
SELECT TOP 1024 [ItemExtras].*
FROM [ItemExtras]
LEFT OUTER JOIN [CurrentArchive].[dbo].[ItemExtras] AS TargetTable
ON [ItemExtras].DocumentID = TargetTable.DocumentID
INNER JOIN @ScopeTable AS ScopeTable
ON [ItemExtras].[DocumentID] = ScopeTable.KeyField
WHERE (TargetTable.DocumentID IS NULL)


它已经在许多不同的数据库上正常工作了多年,但是突然在一个特定的数据库上,它返回38563,这显然是“ INSERT INTO @ScopeTable”部分中的行数,因为另一个插入执行的是“ TOP 1024”。

是否有一些SQL Server设置可以使其更改这样的行为?依靠返回0是否不合适?

编辑:根据要求,这是运行循环的(Delphi)代码。 DataAccess.NewCommand使用一个TA​​DOCommand,如果遇到异常,则返回-1:

TopClause := '';
TopCount := 2048;
Finished := false;
while not Finished do
begin
AffectedRecords := fDataAccess.NewCommand(Format(
'%s INSERT INTO %s SELECT%s%s [%s].* FROM [%s] %s',
[PreClause, QualifiedTable, ManyToOneClause, TopClause, Table, Table, WhereClause]));

if AffectedRecords >= 0 then
begin
if TopClause = '' then // first time through
Finished := true
else if AffectedRecords < TopCount then // other times through
Finished := true;
end
else
begin
// if that fails, try top 1024, 512, etc until we reach 0 or it succeeds
TopCount := TopCount div 2;
if TopCount = 0 then
begin
fTracker.LastError := 'Failed to insert items for table ' + QualifiedTable;
raise Exception.Create(fTracker.LastError);
end;
TopClause := ' TOP ' + IntToStr(TopCount);
end;
end;

最佳答案

您可以尝试在第一个INSERT之前将NOCOUNT设置为on,然后在之后将其重置为:

DECLARE @ScopeTable TABLE (  KeyField bigint,  PRIMARY KEY ( KeyField ) )

SET NOCOUNT ON

INSERT INTO @ScopeTable
SELECT DISTINCT DocumentID FROM [CurrentArchive].[dbo].[ItemData]
WHERE DocumentID IS NOT NULL

SET NOCOUNT OFF

INSERT INTO [CurrentArchive].[dbo].[ItemExtras]
SELECT TOP 1024 [ItemExtras].*
FROM [ItemExtras]
LEFT OUTER JOIN [CurrentArchive].[dbo].[ItemExtras] AS TargetTable
ON [ItemExtras].DocumentID = TargetTable.DocumentID
INNER JOIN @ScopeTable AS ScopeTable
ON [ItemExtras].[DocumentID] = ScopeTable.KeyField
WHERE (TargetTable.DocumentID IS NULL)

关于sql-server - 一批语句中受SQL影响的行数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9741532/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com