none
Ayuda con subconsulta select Sql Server RRS feed

  • Pregunta

  • Hola tengo una consulta a una funcion de SQL Server y necesito que en esa misma consulta me muestre campos de una tabla. Lo hice asi pero me muestra error. Ademas me subraya el query en rojo y aparece un mensaje que dice: Se ha especificado un numero insuficiente de argumentos para el procedimiento o funcion funcion1

    funcion1 es una funcion con valores de tabla

    tabla es una tabla de mi BD

    Se que mi query esta mal pero no se como hacerla.

    Select * from dbo.funcion1('A','2014-07-01','2014-07-01','2018-04-30',0,1, (Select campo1, campo2 from tabla where Cod_user='101'), '101',0) Order by Cod_lin

    Error:

    Mens. 116, Nivel 16, Estado 1, Línea 8 Sólo se puede especificar una expresión en la lista de selección cuando la subconsulta no se especifica con EXISTS. Mens. 313, Nivel 16, Estado 3, Línea 8 Se proporcionó un número insuficiente de argumentos para el procedimiento o la función funcion1

    Gracias por leer

    lunes, 30 de abril de 2018 18:14

Todas las respuestas

  • Lo que estas buscando con tu consulta esta ambiguamente explicado y dificil de entender, creo que te estas complicando la vida con una consulta tan sensilla utilizando una function, para mi entender major debes utilizer los join en tu consulta osea inner join, left join etc, pero es dificil ayudarte por que no se puede entender lo que estas buscando
    lunes, 30 de abril de 2018 18:50
  • Hola Sunflower18:

    Un ejemplo de como se hace.

    /* TABLA EJEMPLO CON CAMPOS Y VALORES FICTICIOS */
    CREATE TABLE DATOSEJEMPLO (
    	ID INT IDENTITY (1,1), 
    	DESCRIPCION VARCHAR(20),
    	FECHAALTA DATE,
    	FECHAMOD DATE,
    	FECHABAJA DATE,
    	NUMERO INT,
    	VALOR INT)
    	GO
    /* TABLA DE EJEMPLO 2 */
    CREATE TABLE TABLA (CODUSER INT,
    	CAMPO1 INT,
    	CAMPO2 INT)
    	GO
    
    	/* CREAMOS UNA FUNCION QUE DEVUELVE UNA TABLA EN BASE A LA TABLA FICTICIA 1 */
    CREATE FUNCTION [dbo].[ejemplo1] (@ARTICULO VARCHAR(20), @FECHA1 DATE, @FECHA2 DATE, @FECHA3 DATE, @CAMPO INT, @CAMPO2 INT )
    RETURNS TABLE
    AS
    RETURN 
    SELECT * FROM DATOSEJEMPLO WHERE
    	DESCRIPCION LIKE @ARTICULO 
    	AND FECHAALTA = @FECHA1
    	AND FECHABAJA = @FECHA2
    	AND FECHAMOD = @FECHA3
    	AND NUMERO = @CAMPO
    	AND VALOR =  @CAMPO2
    GO
    /* INSERTAMOS VALORES EN LA TABLA FICTICIA */
    INSERT INTO DATOSEJEMPLO (DESCRIPCION,FECHAALTA,FECHAMOD,	FECHABAJA,	NUMERO ,	VALOR )
    VALUES ('PRUEBA1','20180301','20180501','20190101',1,5),
    	('PRUEBA2','20180301','20180501','20190101',2,6),
    	('PRUEBA3','20180301','20180501','20190101',3,15),
    	('PRUEBA4','20180301','20180501','20190101',4,12),
        ('PRUEBA5','20180301','20180501','20190101',5,3)
    GO
    /* INSERTAMOS VALORES EN LA TABLA FICTICIA 2 */
    INSERT INTO TABLA   (CODUSER,CAMPO1 ,	CAMPO2 ) VALUES (1,1,1),(1,2,1), (1,3,1), (1,4,1)
    GO
    
    SELECT * FROM dbo.ejemplo1('PRUEBA1', '20180301' ,'20190101','20180501',1,5 ) AS O
    /* LA FUNCION SE CONSUME COMO UNA TABLA CUALQUIERA, EN EL FROM, PERO HAY QUE PASARLE TANTOS PARAMETROS COMO TENGAMOS DEFINIDOS */
    /* LE ESTABLECEMOS UN ALIAS, PARA REFERENCIAR SUS CAMPOS */
    	LEFT OUTER JOIN TABLA T ON O.ID = T.CODUSER
    /* ESTABLEZCO UNA RELACION CONTRA LA OTRA TABLA */
    

    Realmente este código, como te dicen no tiene mucho sentido. Si se puede eliminar el uso de este tipo de funciones, será mucho más efectivo, contra tablas normales, ya que en el ejemplo podría ser directamente.

    SELECT * FROM DATOSEJEMPLO AS O 
    LEFT OUTER JOIN TABLA T ON O.ID = T.CODUSER
    WHERE O.DESCRIPCION = 'PRUEBA1'
    AND O.FECHAALTA = '20180301' 
    AND O.FECHABAJA= '20190101'
    AND O.FECHAMOD='20180501'
    AND O.NUMERO=1
    AND O.VALOR=5

    Espero te sirva.

    Un saludo

    lunes, 30 de abril de 2018 21:31
  • Gracias por responder, lo he resuelto asi:

    Select * 
    from dbo.funcion1 ('A','2014-07-01','2014-07-01','2018-04-30',0,1, 
    (  Select top 1 campo1
       from tabla where Cod_user='101' ), 
    (  Select top 1 campo2
       from tabla where Cod_user='101' ),'101',0) 
    Order by Cod_lin

    miércoles, 2 de mayo de 2018 14:54