tSQLtAssertResultSetsHaveSameMetaData
を使用して、多数の列を返すクエリからメタデータをチェックしようとしています。
失敗すると、「予想される/だった」という詳細を示すメッセージが切り捨てられるため、2 つの情報から何が問題なのかを確認できません。メッセージが切り捨てられないように (たとえば、ファイルに) 出力する方法はありますか?
tSQLtAssertResultSetsHaveSameMetaData
を使用して、多数の列を返すクエリからメタデータをチェックしようとしています。
失敗すると、「予想される/だった」という詳細を示すメッセージが切り捨てられるため、2 つの情報から何が問題なのかを確認できません。メッセージが切り捨てられないように (たとえば、ファイルに) 出力する方法はありますか?
実際に何をテストしているかによって異なります。幅広い結果セットでは、AssertResultsSetsHaveSameMetaData からの出力が少し扱いにくいことに同意します。ストアド プロシージャの場合、次のようにテストを記述します。
create procedure [ProcedureTests].[テスト SelectProcedure 結果セット コントラクト] なので 始める テーブルを作成 #expected ( name varchar(500) が null ではない 、column_ordinal int 非 null ID(1,1) 、system_type_name varchar(500) が null ではない 、nullability varchar(16) が null ではない ) ; expectedCte (名前、system_type_name、Nullability) を使用 なので ( 'ItemId' 、 'int' 、 'not null' を選択 union all select 'ActorId' , 'int' , 'not null' union all select 'LanId' , 'nvarchar(200)' , 'not null' union all select 'ConsumerId' , 'int' , 'not null' union all select 'ConsumerMoniker' , 'nvarchar(200)' , 'not null' union all select 'ProfileTypeId' , 'int' , 'not null' union all select 'ProfileTypeName' , 'varchar(50)' , 'not null' union all select 'ProfileId' , 'int' , 'not null' ) 挿入#期待 ( 名前 、system_type_name 、null可能性 ) 名前、system_type_name、expectedCte からの Nullability を選択します。 ――!活動 選択する 名前 、column_ordinal 、system_type_name , case is_nullable when 1 then 'null' else 'not null' end as [Nullability] の中へ #実際 から sys.dm_exec_describe_first_result_set_for_object(object_id('mySchema.SelectProcedure'), 0); ――!主張する exec tSQLt.AssertEqualsTable #expected, #actual; 終わり; 行く
ビューの場合は、この(わずかに異なる)アプローチを使用できます。
手順の変更 [ViewTests].[ViewName 結果セット コントラクトのテスト] なので 始める テーブルを作成 [ViewTests].[期待される] ( TransactionId int が null ではない 、SourceId int が null でない 、SourceKey nvarchar(50) が null ではない 、TransactionTypeId int 非 null 、TransactionStatusId int 非 null 、LastModified 日時が null ではない ); ――!比較はこれと同じくらい簡単かもしれません(ただし、以下の代替アプローチを参照してください) exec tSQLt.AssertEqualsTableSchema '[ViewTests].[期待される]', 'mySchema.ViewName'; ――! ――!dm_exec_describe_first_result_set の is_nullable カラムのようです (tSQLt.AssertEqualsTableSchema で使用) ――!ビューが関係する場合は少し不安定になる可能性があるため、テスト時にnull可能性を無視する必要がある場合があります ――!このビュー (両方の SELECT でその列をコメントアウトします) ――! 選択する c.name as [ColumnName] 、c.column_id as [ColumnPosition] 、 場合 when st.name in ('char', 'varchar', 'varbinary') then st.name + '(' + case when c.max_length = -1 then 'max' else 合体 (cast(c.max_length as varchar(8)), '???') end + ')' when st.name in ('nchar', 'nvarchar') then st.name + '(' + case when c.max_length = -1 then 'max' else 合体 (cast(c.max_length / 2 as varchar(8)), '???') end + ')' when st.name in ('decimal', 'numeric') 次に st.name + '(' + 合体 (キャスト (c.precision as varchar(8)), '???') + ',' + 合体 (キャスト(c.scale as varchar(8)), '? ??') + ')' when st.name in ('time', 'datetime2', 'datetimeoffset') その後 st.name + '(' + 合体 (キャスト (c.precision as varchar(8)), '???') + ')' それ以外の st.name [データ型] として終了 、c.[精度] as [NumericScale] 、c.scale as [NumericPrecision] 、c.collation_name as [CollationName] , cast(case c.is_nullable when 1 then 'null' else 'not null' end as varchar(16)) as [Nullability] の中へ #期待される から sys.columns as c 内部結合 sys.types を st として st.system_type_id = c.system_type_id で および st.user_type_id = c.user_type_id どこ c.[object_id] = object_id('[ViewTests].[expected]') 選択する [ColumnName] として名前を付けます 、column_ordinal as [ColumnPosition] 、[DataType] としての system_type_name 、[精度] as [NumericScale] 、[NumericPrecision] としてスケーリング 、collation_name as [CollationName] , cast(case is_nullable when 1 then 'null' else 'not null' end as varchar(16)) as [Nullability] の中へ #実際 から sys.dm_exec_describe_first_result_set('select * from mySchema.ViewName, null, null) exec tSQLt.AssertEqualsTable '#expected', '#actual' ; 終わり 行く
何らかの障害が発生した場合でも、出力が AssertEqualsTable に似ているため、理由はより明確になります。