web-dev-qa-db-ja.com

SSMS-オブジェクトエクスプローラーで大文字と小文字を区別しない検索を行う方法

序文:私はではありませんクエリを参照 です。

SSMSには、オブジェクトエクスプローラーやプロファイラーなど、フィルター処理を可能にする多くの場所がありますが、これらはすべて、フィルターを大文字と小文字を区別して表示オプションなしで処理するため、contains 'ASDF'を検索すると、「ASDF_MyEntity」のような値になります。含まれていますが、「asdf_MyEntity」は省略されています。

enter image description here

たとえば、大規模なサーバー上にSQLエージェントジョブのlotがあり、オブジェクトエクスプローラーを使用してプロジェクト名でそれらをフィルターしようとしています。ジョブ名。ただし、これらは大文字と小文字の両方のバリエーションとして表示されます。

別の使用例は、数千のエントリの中からモジュールに関連するストアドプロシージャを検索することです。一貫性のない名前が付けられている場合(たとえば、PascalCaseとcamelCaseの場合)、フィルター検索では省略されます。これは、デバッグのためのファントムの不必要な危険のようです。

さらに、オブジェクトエクスプローラーでの並べ替えでは、すべての種類のエンティティ(テーブル名、ストアドプロシージャ、ジョブ名など)について、大文字のバリアントが小文字の前に(大文字のZが小文字のaの前に来るように)配置されます。 )なので、たくさんスクロールするか、2つの異なるフィルターをチェックする必要があります(すべて大文字でも小文字でもない場合はさらに多く— 2)len(名前) 正確には時間)。

jobstables 、およびその他のエンティティを手動でクエリできることはわかっていますが、SSMSが存在することを考えると、これは無意味です。その名前は "SQL Server管理スタジオ。」

他のすべてのWindowsアプリケーションのように、SSMS(およびSQL Server Profiler)で大文字と小文字を区別するためにできることはありますか?おそらく、照合設定をローカルで変更できますか?

また、SSMSの実装時にこの決定がマイクロソフトによって行われたのはなぜですか?私はそれが有害なだけであることがわかりました。

さらに、SSMSの読み込みスプラッシュ画面は、ソリューションエクスプローラーで大文字と小文字を区別しない「Visual Studioで構築」と表示されます。

追伸SSMS 2014(バージョン12.0.5214.6)を使用します。サーバー側で変更を加えることはできません。ローカル開発環境は、テスト目的でターゲットサーバー環境と一致している必要があります。

3
Elaskanator

Containsフィルターを適用するときに実行されるクエリをキャプチャするためにプロファイラーを使用して、クエリを見つけました:

    exec sp_executesql N'SELECT
sp.name AS [Name],
SCHEMA_NAME(sp.schema_id) AS [Schema],
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/StoredProcedure[@Name='' + quotename(sp.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(sp.schema_id),'''''''') + '']'' AS [Urn],
sp.create_date AS [CreateDate],
ISNULL(ssp.name, N'''') AS [Owner],
CAST(CASE WHEN ISNULL(smsp.definition, ssmsp.definition) IS NULL THEN 1 ELSE 0 END AS bit) AS [IsEncrypted],
CASE WHEN sp.type = N''P'' THEN 1 WHEN sp.type = N''PC'' THEN 2 ELSE 1 END AS [ImplementationType],
ISNULL(sm.uses_native_compilation,0) AS [IsNativelyCompiled]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.database_principals AS ssp ON ssp.principal_id = ISNULL(sp.principal_id, (OBJECTPROPERTY(sp.object_id, ''OwnerId'')))
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
LEFT OUTER JOIN sys.all_sql_modules AS sm ON sm.object_id = sp.object_id
WHERE
(sp.type = @_msparam_0 OR sp.type = @_msparam_1 OR sp.type=@_msparam_2)and(CAST(
 case 
    when sp.is_ms_shipped = 1 then 1
    when (
        select 
            major_id 
        from 
            sys.extended_properties 
        where 
            major_id = sp.object_id and 
            minor_id = 0 and 
            class = 1 and 
            name = N''Microsoft_database_tools_support'') 
        is not null then 1
    else 0
end          
             AS bit)=@_msparam_3 and ISNULL(sm.uses_native_compilation,0)=@_msparam_4 and sp.name like N''%Test%'')',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'P',@_msparam_1=N'RF',@_msparam_2=N'PC',@_msparam_3=N'0',@_msparam_4=N'0'

パーツが含まれているもの:

and sp.name like N''%Test%''

そして私に結果を与えます:

Name    Schema  Urn CreateDate  Owner   IsEncrypted ImplementationType  IsNativelyCompiled
TestCs  dbo Server[@Name='DESKTOP-602CJ92\  2019-01-28 20:05:28.220 dbo 0   1   0

@BobKlimesが述べたように、CSサーバーでは不可能です。

また、CIサーバー上のCS DBでは不可能であるように見えます。

enter image description here

その結果、追加された link で指摘したのと同じ問題が発生します。

クエリが保存されている場所を見つけて変更しない限り、それを回避する方法はないと思います。


計画ガイドを使用して照合のヒントを追加しようとしました

次のクエリは、COLLATEヒントを追加したので、欲しいものを提供してくれるので、元のクエリで、照合クエリのクエリプランXMLを使用してプランガイドを作成してみました。

必要なフィルタリングを提供するクエリ

exec sp_executesql N'SELECT
sp.name AS [Name],
SCHEMA_NAME(sp.schema_id) AS [Schema],
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/StoredProcedure[@Name='' + quotename(sp.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(sp.schema_id),'''''''') + '']'' AS [Urn],
sp.create_date AS [CreateDate],
ISNULL(ssp.name, N'''') AS [Owner],
CAST(CASE WHEN ISNULL(smsp.definition, ssmsp.definition) IS NULL THEN 1 ELSE 0 END AS bit) AS [IsEncrypted],
CASE WHEN sp.type = N''P'' THEN 1 WHEN sp.type = N''PC'' THEN 2 ELSE 1 END AS [ImplementationType],
ISNULL(sm.uses_native_compilation,0) AS [IsNativelyCompiled]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.database_principals AS ssp ON ssp.principal_id = ISNULL(sp.principal_id, (OBJECTPROPERTY(sp.object_id, ''OwnerId'')))
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
LEFT OUTER JOIN sys.all_sql_modules AS sm ON sm.object_id = sp.object_id
WHERE
(sp.type = @_msparam_0 OR sp.type = @_msparam_1 OR sp.type=@_msparam_2)and(CAST(
 case 
    when sp.is_ms_shipped = 1 then 1
    when (
        select 
            major_id 
        from 
            sys.extended_properties 
        where 
            major_id = sp.object_id and 
            minor_id = 0 and 
            class = 1 and 
            name = N''Microsoft_database_tools_support'') 
        is not null then 1
    else 0
end          
             AS bit)=@_msparam_3 and ISNULL(sm.uses_native_compilation,0)=@_msparam_4 and sp.name like N''%Test%''COLLATE Latin1_General_CI_AS)',N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',@_msparam_0=N'P',@_msparam_1=N'RF',@_msparam_2=N'PC',@_msparam_3=N'0',@_msparam_4=N'0'

結果:

Name    Schema  Urn CreateDate  Owner   IsEncrypted ImplementationType  IsNativelyCompiled
testCs  dbo Server[@Name='DESKTOP-602CJ92\  2019-01-28 20:05:23.830 dbo 0   1   0
TestCs  dbo Server[@Name='DESKTOP-602CJ92\  2019-01-28 20:05:28.220 dbo 0   1   0

計画ガイドを作成します(XMLが大きすぎるため、表示されていません)これに従いました Answer

EXEC sp_create_plan_guide 
    @name = 'Filtering', 
    @stmt = N'SELECT
sp.name AS [Name],
SCHEMA_NAME(sp.schema_id) AS [Schema],
''Server[@Name='' + quotename(CAST(
        serverproperty(N''Servername'')
       AS sysname),'''''''') + '']'' + ''/Database[@Name='' + quotename(db_name(),'''''''') + '']'' + ''/StoredProcedure[@Name='' + quotename(sp.name,'''''''') + '' and @Schema='' + quotename(SCHEMA_NAME(sp.schema_id),'''''''') + '']'' AS [Urn],
sp.create_date AS [CreateDate],
ISNULL(ssp.name, N'''') AS [Owner],
CAST(CASE WHEN ISNULL(smsp.definition, ssmsp.definition) IS NULL THEN 1 ELSE 0 END AS bit) AS [IsEncrypted],
CASE WHEN sp.type = N''P'' THEN 1 WHEN sp.type = N''PC'' THEN 2 ELSE 1 END AS [ImplementationType],
ISNULL(sm.uses_native_compilation,0) AS [IsNativelyCompiled]
FROM
sys.all_objects AS sp
LEFT OUTER JOIN sys.database_principals AS ssp ON ssp.principal_id = ISNULL(sp.principal_id, (OBJECTPROPERTY(sp.object_id, ''OwnerId'')))
LEFT OUTER JOIN sys.sql_modules AS smsp ON smsp.object_id = sp.object_id
LEFT OUTER JOIN sys.system_sql_modules AS ssmsp ON ssmsp.object_id = sp.object_id
LEFT OUTER JOIN sys.all_sql_modules AS sm ON sm.object_id = sp.object_id
WHERE
(sp.type = @_msparam_0 OR sp.type = @_msparam_1 OR sp.type=@_msparam_2)and(CAST(
 case 
    when sp.is_ms_shipped = 1 then 1
    when (
        select 
            major_id 
        from 
            sys.extended_properties 
        where 
            major_id = sp.object_id and 
            minor_id = 0 and 
            class = 1 and 
            name = N''Microsoft_database_tools_support'') 
        is not null then 1
    else 0
end          
             AS bit)=@_msparam_3 and ISNULL(sm.uses_native_compilation,0)=@_msparam_4 and sp.name like N''%Test%'')',
    @type = 'SQL',
    @params = N'@_msparam_0 nvarchar(4000),@_msparam_1 nvarchar(4000),@_msparam_2 nvarchar(4000),@_msparam_3 nvarchar(4000),@_msparam_4 nvarchar(4000)',
    @hints = @planXML
GO

プランガイドを作成できますが、元のクエリに固執していないようです。

Commands completed successfully.

サイコロなし

Name    Schema  Urn CreateDate  Owner   IsEncrypted ImplementationType  IsNativelyCompiled
TestCs  dbo Server[@Name='DESKTOP-602CJ92\  2019-01-28 20:05:28.220 dbo 0   1   0

エラーが見つかりました

SELECT *
FROM sys.plan_guides 
    CROSS APPLY sys.fn_validate_plan_guide (plan_guide_id)
WHERE name = 'Filtering2'

enter image description here

XMLプランをプランガイドに追加する別のアプローチを試みたときに同じエラーが発生しました

DECLARE @xml_showplan nvarchar(max);  
SET @xml_showplan = (SELECT query_plan  
    FROM sys.dm_exec_query_stats AS qs   
    CROSS APPLY sys.dm_exec_sql_text(qs.sql_handle) AS st  
    CROSS APPLY sys.dm_exec_text_query_plan(qs.plan_handle, DEFAULT, DEFAULT) AS qp  
    WHERE st.text LIKE N'%uses_native_compilation%' and  st.text like '%COLLATE%'

enter image description here

私の推測では、それは以下の略です:

NO_PLAN:強制プランがクエリに対して有効であると確認できなかったため、クエリプロセッサはクエリプランを作成できません

ソース

私はおそらくプランガイドでは不可能なことをしています。

4
Randi Vertongen