无法删除含连字符的SQL Server数据库?求助排查问题
你给出的drop database [nfm_example-F2_6]语句本身在SQL Server中是合法语法,报错大概率不是语句本身的问题,可从以下方向排查:
确认
tempdbname变量的实际值
虽然你提到SQL Server收到的语句正确,但仍要检查变量是否为纯字符串nfm_example-F2_6——有没有可能包含空格、制表符、换行符这类不可见字符?比如复制数据库名时误带了全角符号,或者变量前后多了空格。可以在代码里加日志或弹窗输出变量细节:ShowMessage(Format('变量长度:%d,内容:"%s"', [Length(tempdbname), tempdbname]));改用参数化执行替代字符串拼接
字符串拼接可能触发组件的隐性处理逻辑,试试用Devart的参数化方式执行删除操作,避免直接拼接:var Query: TMSQuery; begin Query := TMSQuery.Create(nil); try Query.Connection := DBConn; Query.SQL.Text := 'drop database :dbname'; Query.ParamByName('dbname').AsString := tempdbname; Query.ExecSQL; finally Query.Free; end; end;检查数据库是否被占用
有时候SQL Server的错误提示会有误导性,即使语句正确,若数据库存在活跃连接,也可能抛出异常。先在SSMS中执行以下语句,查看是否有会话连接到目标数据库:SELECT session_id, login_name FROM sys.dm_exec_sessions WHERE database_id = DB_ID('nfm_example-F2_6')如果有结果,先通过
KILL 会话ID;终止这些会话,再尝试删除。确认Devart SDAC版本与连接上下文
旧版本SDAC可能对带特殊字符的数据库名存在处理bug,检查你的SDAC是否为最新稳定版。另外,确保连接的数据库是master库——虽在其他库也能执行删除,但切换到master库可避免部分权限或上下文问题。在SSMS中直接验证语句
把SQL Server收到的语句drop database [nfm_example-F2_6]复制到SSMS执行:如果能成功删除,说明问题出在Delphi代码或SDAC组件处理上,重点排查前3点;如果SSMS也报错,说明数据库名确实存在隐性问题(比如包含不可见字符),需要重新确认数据库的真实名称。
内容的提问来源于stack exchange,提问作者complete_stranger

