INSERT SQL语句使用With ROW_NUMBER时报With附近语法错误如何解决?
问题原因
- 批处理语句终止符缺失:SQL Server规定,若
WITH关键字不是当前批处理的首个语句,其前面必须添加分号;作为前序语句的终止标识。你代码中WITH紧跟在INSERT语句之后,没有添加前导分号,直接触发了「关键字 'With' 附近有语法错误」的报错。 - 潜在命名冲突(非直接报错原因,建议优化):你将CTE的名称设置为
Row_Number,和SQL内置窗口函数ROW_NUMBER()重名,后续逻辑扩展或维护时极易引发不必要的命名冲突。
修正后代码
IF OBJECT_ID ('tempdb..#Assignments') IS NOT NULL DROP TABLE #Assignments CREATE TABLE #Assignments ( SerialNumber VARCHAR(24) NOT NULL ) INSERT INTO #Assignments (SerialNumber) ;WITH SerialDuplicates AS ( SELECT SerialNumber, ROW_NUMBER() OVER (PARTITION BY serialNumber ORDER BY serialnumber) AS Row_Num FROM Monitor WHERE SerialNumber IS NOT NULL ) SELECT SerialNumber FROM SerialDuplicates WHERE Row_Num > 1
可选优化方案
如果你只是需要提取Monitor表中出现过至少2次的SerialNumber存入临时表,可以用更简洁的GROUP BY写法,无需使用CTE:
IF OBJECT_ID ('tempdb..#Assignments') IS NOT NULL DROP TABLE #Assignments CREATE TABLE #Assignments ( SerialNumber VARCHAR(24) NOT NULL ) INSERT INTO #Assignments (SerialNumber) SELECT SerialNumber FROM Monitor WHERE SerialNumber IS NOT NULL GROUP BY SerialNumber HAVING COUNT(*) > 1
内容的提问来源于stack exchange,提问作者Daniel Hudsky
相关产品推荐
相关产品推荐

