web-dev-qa-db-ja.com

ユーザー定義のテーブルタイプの挿入により、変換エラーが発生することがあります

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を使った初めての実際の経験なので、明らかな何かが欠けていることを願っていますが、これは私には意味がありません。さらに詳しい情報が必要な場合はお知らせください。

15
theChrisKent
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)
17
dance2die