小编典典

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

sql

我有一个名为 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值“某些名称”转换为数据类型int时,转换失败。

但是,在另一个存储过程中,我正在这样做 (@ AddressLine1和@ AddressLine1是VARCHAR)

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

而且一切正常。

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

这是我第一次使用UDT,这是我的第一次真实经验,所以我希望我只是缺少一些明显的东西,但这对我来说没有任何意义。让我知道您是否需要更多信息。


阅读 125

收藏
2021-04-22

共1个答案

小编典典

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)
2021-04-22