我的电脑名称中的连字符导致了T-SQL错误。

我是一名开发人员,不是DBA(很遗憾,这一点显而易见)。我正在尝试在我的家用电脑(名为John-PC)上使用SQL Server 2014 Express运行Report Builder 3.0,但无法运行我的报表。 我不小心创建了一个用户/登录组合:user = John-PClogin = John-PC\John。当我尝试删除该条目时:
Drop Login John-PC\John
我遇到了一个错误: “-”附近的语法不正确。 我认为问题出在我的计算机名称中的连字符上。 有没有办法绕过语法错误? 是否有其他方法可以更改或删除用户(我尝试从sys.server_principals中删除,但收到了无法进行临时更改的错误)? 我能否以某种方式为Report Builder提供一个新的用户/登录名? 如果以上都不行,我能否将计算机名称更改为John_PC,还是会引发一系列我无法想象的其他问题?
2个回答

当您在名称中有特殊字符时,请使用[]将其括起来,以让SQL知道它是一个标识符。这也是您处理特殊字符的方法。 所以在您的情况下,
Drop Login [John-PC\John]

如果你只有一个登录账号,那么用 [ ] 手动引用它将会起作用。如果你有很多个登录账号,那么你需要构建一个动态 SQL,像下面这样通过编程从 sys.server_principals 中使用 QUOTENAME() tsql 获取 drop login [login_to_drop]
DECLARE @sql NVARCHAR(MAX) = N'';

SELECT @sql+= N'DROP LOGIN ' + QUOTENAME(name) + ';' 
FROM sys.server_principals 
WHERE name <> N'sa'                 -- do not drop SA
AND name NOT LIKE N'##%'            -- special logins 
AND name NOT LIKE N'NT [AS]%'       -- special logins NT related
AND [type] IN ('S', 'U', 'G','R')   -- S = SQL login | U = Windows login | G = Windows group | R = Server role
AND principal_id > 256
--AND name in ()                    -- Filter to drop specific logins
AND name <> SUSER_SNAME();          -- This will avoid yourself for being dropped !

PRINT @sql;
-- once you verify that below logins will be dropped, 
-- uncomment below line 
-- EXEC master.sys.sp_executesql @sql;
教训已经得到,不要使用特殊字符...否则就要准备好面对它们带来的一些痛苦 :-)