我的计算机名称中的连字符导致 T-SQL 错误

Joh*_* MM 13 sql-server t-sql sql-server-2014

我是一名开发人员,而不是一名 DBA(我很担心这是在展示)。我正在尝试在我的家用计算机(名为John-PC)上使用 SQL Server 2014 Express 运行 Report Builder 3.0,但无法运行我的报告。

我无意中创建的用户/登录组合user = John-PClogin = John-PC\John。当我尝试删除条目时:

Drop Login John-PC\John
Run Code Online (Sandbox Code Playgroud)

我收到一个错误:

“-”附近的语法不正确。

我认为问题在于我的计算机名称中的连字符。

  1. 有没有办法绕过语法错误?
  2. 是否有另一种更改或删除用户的方法(我尝试删除sys.server_principals但收到一个错误,我无法进行临时更改)。
  3. 我可以以某种方式给 Report Builder 一个新的用户名/登录名吗?
  4. 如果以上都不是,我可以将我的计算机名称更改为John_PC还是会产生许多我无法想象的其他问题?

Ken*_*her 21

当名称中有特殊字符时,将 [] 放在其周围以让 SQL 知道它是一个标识符。这也是您管理特殊字符的方式。

所以在你的情况下

Drop Login [John-PC\John]
Run Code Online (Sandbox Code Playgroud)


Kin*_*hah 12

如果您只有一个登录名,那么手动引用它就[ ]可以了。如果你有很多人,那么你必须建立一个动态的SQL像下面progrmatically获得drop login [login_to_drop]sys.server_principals使用QUOTENAME()TSQL

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;
Run Code Online (Sandbox Code Playgroud)

吸取教训,不要使用特殊字符..否则要准备好处理它们的痛苦:-)