【发布时间】:2022-10-21 22:29:59
【问题描述】:
我正在运行一个批量更新脚本,其中 @masterNameID 在 (21,22,23) 中,但是当我运行这个 sn-p 时出现语法错误;
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE
@MasterNameID AS INT in (21,22,23)
,@RowCount AS INT
我尝试使用下面的方法声明一个临时表,但仍然无法运行;
Declare @MasterNameTlb table (MasterNameID INT (5))
Insert into @MasterNameTlb (MasterNameID) values (21,22,23)
Set @MasterNameID AS INT = select MasterNameID from @MasterNameTlb
关于如何让它运行或者是否有更有效的方法来为更新脚本声明多个值的任何想法?
**编辑:
抱歉,我在这里要做的是修改一个更新脚本,该脚本将以 20k 为单位进行更新,其中值在 (21,22,23) 中。尝试“in (21,22,23)”时出现语法错误。我还尝试创建一个临时表以从中提取值,但仍然出现错误。任何帮助,将不胜感激。
完整的原始脚本:
PRINT 'Shell_Index.SQL BEGIN'
If Object_ID('tempdb..#temp') Is Not Null
DROP Table #temp
GO
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED
DECLARE
@MasterNameID AS INT
,@RowCount AS INT
DECLARE @Begin int
DECLARE @End int
DECLARE @Buffer int
DECLARE @MaxRec INT
SELECT
et.ESTrackLogID
,et.ESFlagSync
,ROW_NUMBER() OVER (ORDER BY et.ESTrackLogID) AS rn
INTO #temp
FROM
tbl1.ESTrackLog AS et
JOIN tbl2 AS c ON c.ContactID = et.ESContactID
WHERE
et.MasterNameID = @MasterNameID
SELECT @RowCount = @@Rowcount
print Cast(@RowCount as nvarchar) + ' row(s) inserted into #temp'
SELECT @Begin = min(rn) from #temp
SELECT @MaxRec = max(rn) from #temp
SELECT @Buffer = 20000
SELECT @End = @Buffer
WHILE @Begin <= @MaxRec
BEGIN
BEGIN TRAN;
UPDATE
et
SET
et.ESFlagSync = 1
FROM
tbl1.ESTrackLog AS et
JOIN #Temp AS a ON a.ESTrackLogID = et.ESTrackLogID
WHERE
et.MasterNameID = @MasterNameID
AND a.rn BETWEEN @Begin and @End
SELECT @RowCount = @@Rowcount
print Cast(@RowCount as nvarchar) + ' row(s) updated in ESTrackLog'
COMMIT TRAN
if @RowCount > 0
BEGIN
WAITFOR delay '00:00:01';
END
SET @Begin = @End + 1
SET @End = @End + @Buffer
END
PRINT 'Shell_Index.SQL DONE'
【问题讨论】:
-
@MasterNameID是一个int这是一个标量值,它不能持有多个值。您实际上想在这里实现什么,因为上述尝试显然是XY Problem 的一部分。 -
“声明@MasterNameTlb 表(MasterNameID INT (5))”这会产生语法错误,
int在 SQL Server 中没有精度/比例参数。 -
你打算用这个变量做什么?
-
READ UNCOMMITTED忘记这个,忘记你曾经知道它的存在。这是一个坏主意,会导致许多并发问题,而且几乎从不需要。
标签: sql sql-server