执行带注释的查询时出现ExecuteReader: CommandText错误的原因及解决方法
关于SQL批处理中注释引发的
CommandText property has not been initialized错误解析 咱们先拆解这个问题的核心原因,再给出对应的解决办法:
错误原因
这个问题和SQL Server的批处理分隔符GO以及注释的位置直接相关:
GO并不是T-SQL的正式语句,它是SSMS等客户端工具用来分割多个独立批处理的标记。工具会把GO前后的内容拆分成不同的批处理分别执行。- 当你执行
print 'test' go -- test时,客户端会把内容拆成两个批处理:- 第一个批处理:
print 'test',这是有效的可执行语句,执行后输出test。 - 第二个批处理:
-- test,这只是一行注释,没有任何可执行的T-SQL语句。相当于提交了一个空的命令文本给数据库驱动,驱动执行空批处理时就会抛出ExecuteReader: CommandText property has not been initialized的错误。
- 第一个批处理:
- 而第一个查询
print 'test' -- test没有GO,整个内容是一个完整的批处理,注释只是语句的后缀,不会被拆分成空批处理,所以执行正常。
解决办法
针对这个问题,你可以用以下几种规范写法避免错误:
- 写法一:把注释放在
GO之前
这样整个带注释的执行语句作为一个批处理,GO之后没有多余内容:print 'test' -- test go - 写法二:将注释单独放在
GO的上一行
这种写法更清晰,也不会产生空批处理:print 'test' -- test go - 写法三:如果
GO后必须加注释,确保后续有可执行语句
如果你确实需要在GO后加注释,要保证该批处理内有有效的执行语句(如果需要多批处理的话):print 'test' go -- 这是第二个批处理的注释 print 'another test'
内容的提问来源于stack exchange,提问作者stubs
相关产品推荐
相关产品推荐

