Usuario
Ayuda con subconsulta select Sql Server

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
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
-
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
-
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