用户定义的表类型插入有时会导致转换错误

时间:2011-05-23 02:53:43

标签: sql tsql sql-server-2008 user-defined-types

我有一个名为 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值'Some Name'   数据类型int。

但是,在另一个存储过程中,我正在执行此操作(@ AddressLine1和@ AddressLine1是VARCHAR)

DECLARE @AuditColumns AS Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
    SELECT  'AddressLine1',@AddressLine1 UNION ALL
    SELECT  'AddressLine2',@AddressLine2

一切正常。

两个存储过程都只是执行一个简单的插入,然后尝试将该类型与另一个以UDT作为参数的存储过程一起使用。

这是我对UDT的第一次真实体验,所以我希望我只是错过了一些明显的东西,但这对我来说毫无意义。如果您需要更多信息,请与我们联系。

1 个答案:

答案 0 :(得分:17)

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)