Пользовательская вставка табличного типа иногда вызывает ошибку преобразования - PullRequest
15 голосов
/ 23 мая 2011

У меня есть пользовательский тип таблицы с именем tvpInsertedColumns :

CREATE TYPE [Audit].[tvpInsertedColumns] AS TABLE(
    [ColumnName] [varchar](max) NOT NULL,
    [NewValue] [varchar](max) NULL
)

В хранимой процедуре я пытаюсь сделать это (@Name и @PhoneVARCHARs) :

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 Ответ

17 голосов
/ 23 мая 2011
DECLARE @AuditColumns Audit.tvpInsertedColumns
INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT  'Name',@Name UNION ALL
SELECT  'Phone',@Phone

Я не знаю много о UDT, но я думаю, что происходит то, что в какой-то момент значения @name или @phone имеют тип integer.

Попробуйте привести@Name и @Phone to varchar

INSERT INTO @AuditColumns (ColumnName,NewValue)
SELECT  'Name', cast(@Name as varchar) UNION ALL
SELECT  'Phone', cast(@Phone as varchar)
...