web-dev-qa-db-ja.com

コンピューター名にハイフンが含まれているとT-SQLエラーが発生する

私はDBAではなく開発者です(表示されているようですが、恐れています)。自宅のコンピューター(John-PCという名前)でSQL Server 2014 Expressを使用してレポートビルダー3.0を実行しようとしていますが、レポートを実行できません。

user = John-PClogin = John-PC\Johnのユーザー/ログインコンボを誤って作成しました。私がエントリを削除しようとすると:

Drop Login John-PC\John

エラーが発生します:

「-」付近の構文が正しくありません。

問題は私のコンピュータ名のハイフンにあると思います。

  1. 構文エラーを回避する方法はありますか?
  2. ユーザーを変更または削除する別の方法はありますか(sys.server_principalsから削除しようとしましたが、特別な変更を行うことができないというエラーを受け取りました)。
  3. どういうわけか、レポートビルダーに新しいユーザー/ログイン名を付けることはできますか?
  4. 上記のいずれにも当てはまらない場合、コンピュータの名前をJohn_PCに変更できますか、それとも、想像もできない他の多くの問題が発生しますか?
13
John MM

名前に特殊文字がある場合は、[]で囲んで、SQLに識別子であることを知らせます。これは、特殊文字を管理する方法でもあります。

だからあなたの場合

Drop Login [John-PC\John]
21
Kenneth Fisher

ログインが1つしかない場合は、 手動で引用 _[_ _]_を使用して機能します。それらが多数ある場合は、以下のような動的SQLを構築して、 QUOTENAME() tsqlを使用して_drop login [login_to_drop]_から_sys.server_principals_をプログラム的に取得する必要があります

_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;
_

学んだ教訓、特殊文字は使用しないでください..さもなければ、いくつかの苦痛を伴うそれらに対処する準備をしてください

12
Kin Shah