2011-05-23 14 views
9

Tengo una definida por el usuario Tipo de tabla llamada tvpInsertedColumns:inserción tipo de tabla definida por el usuario a veces causando error de conversión

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

en un procedimiento almacenado que estoy tratando de hacer esto (Tanto @Name y @ teléfono son VARCHAR):

DECLARE @AuditColumns Audit.tvpInsertedColumns 
INSERT INTO @AuditColumns (ColumnName,NewValue) 
    SELECT 'Name',@Name UNION ALL 
    SELECT 'Phone',@Phone 

Esta falla con el error:

Conversion failed when converting the varchar value 'Some Name' to data type int.

Sin embargo, en otro procedimiento almacenado que estoy haciendo esto (@ @ AddressLine1 y AddressLine1 son VARCHAR):

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

y todo funciona muy bien.

Ambos procedimientos almacenados solo hacen una inserción simple y luego intentan usar el tipo junto con otro procedimiento almacenado que toma el UDT como parámetro.

Esta es mi primera experiencia real con UDT, así que espero que me esté perdiendo algo obvio, pero esto no tiene sentido para mí. Avíseme si necesita más información.

Respuesta

10
DECLARE @AuditColumns Audit.tvpInsertedColumns 
INSERT INTO @AuditColumns (ColumnName,NewValue) 
SELECT 'Name',@Name UNION ALL 
SELECT 'Phone',@Phone 

No sé mucho acerca de los UDT, pero lo que creo que está ocurriendo es que, en un momento dado, ya sea @name o @phone valores son de tipo entero.

intenta convertir @Name y @phone a VARCHAR

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

+1 y para tu información, no es un error de UDT, pero prevalece en el tipo de datos UNION ALL antes del INSERT sucede – gbn

+0

Esto no fue del todo bien , pero me llevó a la solución (y eso es todo lo que quería). Las variables '@ Name' y' @ Phone' nunca cambiaron los tipos, el problema fue que en algún momento (después del corte de muestra) también estaba insertando un entero suponiendo que habría una conversión automática. Al convertir todos los tipos que no son 'VARCHAR' a' VARCHAR (MAX) 'se solucionó el problema. Sospecho que gbn tiene razón en que esto no tiene nada que ver con los UDT, sino con la prioridad de tipo de datos en las declaraciones de 'UNION'. Gracias a los dos por su ayuda. – theChrisKent

Cuestiones relacionadas