为何我的SQL游标循环中EXEC语句出现语法错误?
问题原因与解决方案
语法错误原因
你遇到的Msg 102错误,根源在于EXEC语句的括号范围错误:
EXEC ('GRANT INSERT ON dbo.tbl_Audit TO ' + '[' + @User) + ']'
这里你仅将('GRANT...' + '[' + @User)放在EXEC的括号内,后续的+ ']'属于括号外的无效语法——SQL引擎无法识别把EXEC调用与字符串拼接运算符混用的写法,因此报错。而PRINT语句可以直接接收完整的字符串拼接表达式,所以替换后语法正常。
修正方案
方案1:修正括号范围
把整个字符串拼接逻辑完整放入EXEC的括号内:
EXEC ('GRANT INSERT ON dbo.tbl_Audit TO ' + '[' + @User + ']')
方案2:使用QUOTENAME函数(更推荐)
QUOTENAME函数会自动为标识符添加方括号,还能处理包含特殊字符的用户名,避免语法错误或SQL注入风险:
EXEC ('GRANT INSERT ON dbo.tbl_Audit TO ' + QUOTENAME(@User))
完整修正后的代码
USE BillingTracking DECLARE @MyCursor CURSOR; DECLARE @User varchar(100); BEGIN SET @MyCursor = CURSOR FOR SELECT SqlUser FROM dbo.tbl_Users ORDER BY SqlUser OPEN @MyCursor FETCH NEXT FROM @MyCursor INTO @User WHILE @@FETCH_STATUS = 0 BEGIN EXEC ('GRANT INSERT ON dbo.tbl_Audit TO ' + QUOTENAME(@User)) FETCH NEXT FROM @MyCursor INTO @User END; CLOSE @MyCursor ; DEALLOCATE @MyCursor; END;
内容的提问来源于stack exchange,提问作者TheSearcher
相关产品推荐
相关产品推荐

