tvpInsertedColumnsというユーザー定義のテーブルタイプがあります:
CREATE TYPE [Audit].[tvpInsertedColumns] AS TABLE(
[ColumnName] [varchar](max) NOT NULL,
[NewValue] [varchar](max) NULL
)
ストアドプロシージャでこれを実行しようとしています(@ Nameと@PhoneはどちらもVARCHARです):
DECLARE @AuditColumns Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT 'Name',@Name UNION ALL
SELECT 'Phone',@Phone
これはエラーで失敗します:
Varchar値 'SomeName'をデータ型intに変換するときに変換に失敗しました。
ただし、別のストアドプロシージャでは、これを実行しています(@ AddressLine1と@ AddressLine1はVARCHARです):
DECLARE @AuditColumns AS Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT 'AddressLine1',@AddressLine1 UNION ALL
SELECT 'AddressLine2',@AddressLine2
そして、すべてがうまく機能します。
両方のストアドプロシージャは、単純な挿入を実行してから、UDTをパラメータとして受け取る別のストアドプロシージャと一緒に型を使用しようとしています。
これはUDTを使った初めての実際の経験なので、明らかな何かが欠けていることを願っていますが、これは私には意味がありません。さらに詳しい情報が必要な場合はお知らせください。
DECLARE @AuditColumns Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT 'Name',@Name UNION ALL
SELECT 'Phone',@Phone
UDTについてはよくわかりませんが、起こっていると思うのは、ある時点で@name
または@phone
値は整数型です。
@Nameと@Phoneをvarcharにキャストしてみてください
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT 'Name', cast(@Name as varchar) UNION ALL
SELECT 'Phone', cast(@Phone as varchar)