【发布时间】:2010-08-26 18:25:09
【问题描述】:
我有以下疑问:
DECLARE @sync_table_name nvarchar(500)
SET @sync_table_name = 'ContactTypes'
DECLARE @sync_batch_size bigint
SET @sync_batch_size = 2
DECLARE @sync_last_received_anchor timestamp
SET @sync_last_received_anchor = 1
DECLARE @sync_max_received_anchor timestamp
SET @sync_max_received_anchor = 18732866
DECLARE @sync_new_received_anchor timestamp
DECLARE @sync_batch_count int
DECLARE @sql NVARCHAR(500)
SET @sql = 'SELECT cast([version] as bigint) as [version], ROW_NUMBER() OVER(ORDER BY CAST([version] as BIGINT)) as RowNumber
INTO #Temp FROM '+@sync_table_name+' WHERE [version] > @min AND [version] <= @max ORDER BY [version];
SET @batchCountOUT = (SELECT COUNT(*) FROM #Temp) / @batchSize;
IF ((SELECT COUNT(*) FROM #Temp) >= @batchSize)
SELECT @newAnchorOUT = #Temp.[version] FROM #Temp WHERE RowNumber = @batchSize;
IF ((SELECT COUNT(*) FROM #Temp) < @batchSize)
SELECT @newAnchorOUT = #Temp.[version] FROM #Temp WHERE RowNumber = (SELECT COUNT(*) FROM #Temp);
DROP TABLE #Temp'
DECLARE @sqlParam NVARCHAR(500)
SET @sqlParam = '@batchSize bigint, @min timestamp, @max timestamp, @newAnchorOUT timestamp OUTPUT, @batchCountOUT int OUTPUT'
EXECUTE sp_executesql @sql, @sqlParam, @batchSize = @sync_batch_size, @min = @sync_last_received_anchor, @max = @sync_max_received_anchor, @newAnchorOUT = @sync_new_received_anchor OUTPUT, @batchCountOUT = @sync_batch_count OUTPUT
SELECT @sync_new_received_anchor, @sync_batch_count
总是在抱怨 Msg 102, Level 15, State 1, Line 8 ')' 附近的语法不正确。
但是如果我删除第二个 IF 语句,一切正常...... sp_executesql 和 IF 语句有什么奇怪的地方
【问题讨论】:
-
顺便说一句:我看到了
(SELECT COUNT(*) FROM #Temp)的 4 种用途。为什么不在插入后将该计数放入变量中并在其他任何地方使用该变量? -
从 Joe 的观点出发,您可以通过在插入后立即将其设置为 @@rowcount 的值来填充该变量。
-
谢谢大家,我做了行数,但出现了其他问题,所以我尝试了不同的方法。
标签: sql sql-server