web-dev-qa-db-ja.com

特定のストアドプロシージャに使用された設定を確認する

前の質問のフォローアップ

何を見つける必要がある方法はありますかANSI_NULLSおよびANSI_PADDING etc.データベースに特定のプロシージャが作成されたときの設定は?

私の顧客はいくつかのストアドプロシージャといくつかのトリガーを「微調整」したようですが、残念ながら、これらのデータベース設定の「間違った」セットを使用しています。 どのプロシージャとトリガーが影響を受けているかを確認できますか、または適切な設定でそれらすべてを再作成する必要がありますか?

5
marc_s

これは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

一部の設定(例:arithabortansi_warningsansi_padding)はオブジェクトとともに保存されません。また、「間違っている」と識別されたものについては、正しい設定で手順を再コンパイルする必要があります。

9
Aaron Bertrand

質問の 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
;
0
BateTech