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

the*_*ent 15 sql t-sql user-defined-types sql-server-2008

我有一个名为tvpInsertedColumns的用户定义表类型:

CREATE TYPE [Audit].[tvpInsertedColumns] AS TABLE(
    [ColumnName] [varchar](max) NOT NULL,
    [NewValue] [varchar](max) NULL
)
Run Code Online (Sandbox Code Playgroud)

在存储过程中我试图这样做(@Name和@Phone都是VARCHAR):

DECLARE @AuditColumns Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
    SELECT  'Name',@Name UNION ALL
    SELECT  'Phone',@Phone
Run Code Online (Sandbox Code Playgroud)

这失败并出现错误:

将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
Run Code Online (Sandbox Code Playgroud)

一切正常.

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

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

dan*_*die 17

DECLARE @AuditColumns Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT  'Name',@Name UNION ALL
SELECT  'Phone',@Phone
Run Code Online (Sandbox Code Playgroud)

我对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)
Run Code Online (Sandbox Code Playgroud)