Principales respuestas
¿Como usar un user-defined table type?

Pregunta
-
Hola a todos,
he creado un tipo de dato en sql server con el siguiente script:
CREATE TYPE [dbo].[varChar5] AS TABLE([item] [varchar](5) NULL)
Despues en un SP espero recibir como parametro un objeto de este tipo:
CREATE PROCEDURE [dbo].[sP]
@x varChar5
AS
BEGIN...
END
El problema es que cuando trato de llamar este SP me sale un error:
Msg 206, Level 16, State 2, Procedure addRegionPerPhase, Line 0
Operand type clash: nvarchar is incompatible with varChar5
Lo llamo de la siguiente manera:
CREATE TABLE #Table([Id] VARCHAR(5))
INSERT INTO #Table select TOP 5 Id From Tabla
exec dbo.sP #Table¿Alguna idea de como resolverlo?
De antemano gracias
Respuestas
-
Hola
Creo que el problema esta en la llamada del SP que estas intentando pasar una tabla temporal, en cambio deberias pasarle una variable del tipo "dbo.varChar5" . Intenta esto:
DECLARE @tabla dbo.varChar5;
INSERT INTO @tabla (item) values ('aaa'),('bbb');EXEC [dbo].[addRegionPerPhase] @NewRegionsIds = @tabla, , @IdPhase =1, @ModifiedBy = 'USER'
Juan Pablo Burgos
- Editado Juan Pablo (ARG) viernes, 10 de mayo de 2013 3:45
- Marcado como respuesta jeduardonl viernes, 10 de mayo de 2013 17:15
Todas las respuestas
-
-
-
Hola.
El mensaje de error indica que estás tratando de convertir el tipo de datos de tipo tabla en varchar, una acción que tendrá lugar dentro del código del procedimiento, pero que no nos facilitaste. Si nos lo informas, puede que podamos darte alguna pista.
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.com
Sígueme en twitter en http://twitter.com/qwalgrande- Marcado como respuesta Alberto López Grande (qwalgrande)Moderator miércoles, 1 de mayo de 2013 6:07
- Desmarcado como respuesta jeduardonl jueves, 2 de mayo de 2013 17:17
-
Hola.
Es necesario aportar algún tipo de feedback para que podamos proseguir. ¿En qué punto te encuentras? ¿Puedes aportar lo solicitado?
Alberto López Grande
SQL Server MVP
Visita mi blog en http://qwalgrande.com
Sígueme en twitter en http://twitter.com/qwalgrande -
El código de mi SP es el siguiente:
ALTER PROCEDURE [dbo].[addRegionPerPhase]
@NewRegionsIds varChar5 READONLY
, @IdPhase SMALLINT
, @ModifiedBy VARCHAR(15)
AS
BEGIN
BEGIN TRY
BEGIN TRANSACTION;
DECLARE @IdRegion VARCHAR(5)
CREATE TABLE #OldRegionsIds([Id] VARCHAR(5))
CREATE TABLE #NewRegionsIdsCopy([Id] VARCHAR(5))INSERT INTO #OldRegionsIds SELECT Id FROM Region WHERE Id NOT IN (SELECT item FROM @NewRegionsIds)
INSERT INTO #NewRegionsIdsCopy SELECT item FROM @NewRegionsIds--Borrar regiones
WHILE(EXISTS(SELECT Id FROM #OldRegionsIds))
BEGIN
SELECT TOP(1) @IdRegion = Id FROM #OldRegionsIds
IF dbo.DoesRegionHaveDeliveries(@IdPhase, @IdRegion) = 0 --No hay entregas
BEGIN
DELETE StatePerRegion WHERE IdPhase = @IdPhase AND IdRegion = @IdRegion
DELETE RegionPerProvider WHERE IdPhase = @IdPhase AND IdRegion = @IdRegion
DELETE RegionPerPhase WHERE IdPhase = @IdPhase AND IdRegion = @IdRegion
END
DELETE TOP(1) FROM #OldRegionsIds
END--Agregar regiones
WHILE(EXISTS(SELECT [Id] FROM #NewRegionsIdsCopy))
BEGIN
SELECT TOP(1) @IdRegion = [Id] FROM #NewRegionsIdsCopy
IF(NOT EXISTS(SELECT TOP 1 IdPhase FROM RegionPerPhase WHERE IdPhase = @IdPhase AND IdRegion = @IdRegion))
BEGIN
INSERT INTO RegionPerPhase (IdPhase, IdRegion, ModifiedBy)
VALUES(@IdPhase, @IdRegion, @ModifiedBy)
END
DELETE TOP(1) FROM #NewRegionsIdsCopy
END
COMMIT TRANSACTION;
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRANSACTION;
END CATCH;
END -
Hola
Creo que el problema esta en la llamada del SP que estas intentando pasar una tabla temporal, en cambio deberias pasarle una variable del tipo "dbo.varChar5" . Intenta esto:
DECLARE @tabla dbo.varChar5;
INSERT INTO @tabla (item) values ('aaa'),('bbb');EXEC [dbo].[addRegionPerPhase] @NewRegionsIds = @tabla, , @IdPhase =1, @ModifiedBy = 'USER'
Juan Pablo Burgos
- Editado Juan Pablo (ARG) viernes, 10 de mayo de 2013 3:45
- Marcado como respuesta jeduardonl viernes, 10 de mayo de 2013 17:15
-