序文:私はではありませんクエリを参照 です。
SSMSには、オブジェクトエクスプローラーやプロファイラーなど、フィルター処理を可能にする多くの場所がありますが、これらはすべて、フィルターを大文字と小文字を区別して表示オプションなしで処理するため、contains 'ASDF'
を検索すると、「ASDF_MyEntity」のような値になります。含まれていますが、「asdf_MyEntity」は省略されています。
たとえば、大規模なサーバー上にSQLエージェントジョブのlotがあり、オブジェクトエクスプローラーを使用してプロジェクト名でそれらをフィルターしようとしています。ジョブ名。ただし、これらは大文字と小文字の両方のバリエーションとして表示されます。
別の使用例は、数千のエントリの中からモジュールに関連するストアドプロシージャを検索することです。一貫性のない名前が付けられている場合(たとえば、PascalCaseとcamelCaseの場合)、フィルター検索では省略されます。これは、デバッグのためのファントムの不必要な危険のようです。
さらに、オブジェクトエクスプローラーでの並べ替えでは、すべての種類のエンティティ(テーブル名、ストアドプロシージャ、ジョブ名など)について、大文字のバリアントが小文字の前に(大文字のZ
が小文字のa
の前に来るように)配置されます。 )なので、たくさんスクロールするか、2つの異なるフィルターをチェックする必要があります(すべて大文字でも小文字でもない場合はさらに多く— 2)len(名前) 正確には時間)。
jobs 、 tables 、およびその他のエンティティを手動でクエリできることはわかっていますが、SSMSが存在することを考えると、これは無意味です。その名前は "SQL Server管理スタジオ。」
他のすべてのWindowsアプリケーションのように、SSMS(およびSQL Server Profiler)で大文字と小文字を区別するためにできることはありますか?おそらく、照合設定をローカルで変更できますか?
また、SSMSの実装時にこの決定がマイクロソフトによって行われたのはなぜですか?私はそれが有害なだけであることがわかりました。
さらに、SSMSの読み込みスプラッシュ画面は、ソリューションエクスプローラーで大文字と小文字を区別しない「Visual Studioで構築」と表示されます。
追伸SSMS 2014(バージョン12.0.5214.6)を使用します。サーバー側で変更を加えることはできません。ローカル開発環境は、テスト目的でターゲットサーバー環境と一致している必要があります。
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では不可能であるように見えます。
その結果、追加された 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'
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%'
私の推測では、それは以下の略です:
NO_PLAN:強制プランがクエリに対して有効であると確認できなかったため、クエリプロセッサはクエリプランを作成できません
私はおそらくプランガイドでは不可能なことをしています。