none
¿Como usar un user-defined table type? RRS feed

  • 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

    viernes, 12 de abril de 2013 18:49

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


    viernes, 10 de mayo de 2013 3:38

Todas las respuestas

  • Hola,

    segun observo tienes mal creado UDT, deberias intentarlo d ela sig manera

    CREATE TYPE [dbo].[varChar5] FROM [varchar](5) NULL

    saludos

    viernes, 12 de abril de 2013 22:21
  • Gracias por contestar pero No, ese no es el problema, mi tipo esta bien creado.

    ¿Alguna otra idea?

    viernes, 12 de abril de 2013 22:52
  • 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

    domingo, 21 de abril de 2013 17:48
    Moderador
  • 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

    jueves, 2 de mayo de 2013 19:53
    Moderador
  • 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

    jueves, 9 de mayo de 2013 16:31
  • 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


    viernes, 10 de mayo de 2013 3:38
  • Funciono a la perfeccion, gracias
    viernes, 10 de mayo de 2013 17:15