何を見つける必要がある方法はありますかANSI_NULLS
およびANSI_PADDING
etc.データベースに特定のプロシージャが作成されたときの設定は?
私の顧客はいくつかのストアドプロシージャといくつかのトリガーを「微調整」したようですが、残念ながら、これらのデータベース設定の「間違った」セットを使用しています。 どのプロシージャとトリガーが影響を受けているかを確認できますか、または適切な設定でそれらすべてを再作成する必要がありますか?
これはsys.sql_modules
:
USE tempdb;
GO
SET ANSI_NULLS ON;
GO
CREATE PROCEDURE dbo.foo1 AS SELECT 1;
GO
SET ANSI_NULLS OFF;
GO
CREATE PROCEDURE dbo.foo2 AS SELECT 1;
GO
SELECT name = OBJECT_NAME([object_id]), uses_ansi_nulls
FROM sys.sql_modules
WHERE OBJECT_NAME([object_id]) IN (N'foo1', N'foo2');
GO
DROP PROCEDURE dbo.foo1, dbo.foo2;
結果:
name uses_ansi_nulls
---- ---------------
foo1 1
foo2 0
その他の便利な列:
object_id
definition
uses_ansi_nulls
uses_quoted_identifier
is_schema_bound
uses_database_collation
is_recompiled
null_on_null_input
execute_as_principal_id
一部の設定(例:arithabort
、ansi_warnings
、ansi_padding
)はオブジェクトとともに保存されません。また、「間違っている」と識別されたものについては、正しい設定で手順を再コンパイルする必要があります。
質問の ANSI_PADDING 部分に関連して、sys.columns
ANSI_PADDING MSDNの記事から:
列が列の定義されたサイズよりも短い値を格納する方法、およびchar、varchar、binary、およびvarbinaryデータに後続ブランクがある値を列が格納する方法を制御します。 ...この設定は、新しい列の定義にのみ影響します。列が作成された後、SQL Serverは列が作成されたときの設定に基づいて値を格納します。既存の列は、この設定を後で変更しても影響を受けません。
次に、影響を受けるデータ型のオブジェクト列のANSIパディング値を確認するクエリを示します。
SELECT TableName = QUOTENAME(SCHEMA_NAME(t.schema_id))
+ '.'
+ QUOTENAME(t.name)
, ColName = c.name
, ColTypeName = ty.name
, c.is_ansi_padded
, ObjectType = t.[type]
, ObjectTypeDesc = t.type_desc
FROM sys.columns c
INNER JOIN sys.objects t on t.object_id = c.object_id
INNER JOIN sys.types ty
ON ty.system_type_id = c.system_type_id
AND ty.user_type_id = c.user_type_id
WHERE ty.name in ('char','varchar','binary','varbinary')
--AND c.is_ansi_padded = 0 --you can filter on 0 to show the columns that are not following best practices.
ORDER BY 1,2
;