我有一个名为 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的第一次真实体验,所以我希望我只是错过了一些明显的东西,但这对我来说毫无意义。如果您需要更多信息,请与我们联系。
答案 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)