none
El identificador formado por varias partes no se pudo en lazar RRS feed

  • Pregunta

  • hola, estoy creando una consulta sencilla la cual es:

    Listar los datos de facturas emitidas para el año 2000, en listado el número de factura
    (nume_fact), fecha de emisión (fech_emis), forma de pago (nomb_form).

    el problema esque me da el error de: 


    select a.nume_fact,a.fech_emis,b.nomb_form <---- el identificador formado por varias partes no se pudo en lazar(en el codigo que esta en negrita)
    from Encabezado <---  nombre de objeto Encabezado no valido     Factura a <---- sintaxis incorrecta de a
    inner join Formas de Pago b
    on a.form_pago=b.form_pago
    where year(a.fech_emis)=2000

    viernes, 20 de septiembre de 2019 21:31

Respuestas

  • Listar los datos de facturas emitidas para el año 2000, en listado el número de factura

    ¿La tabla "Encabezado Factura" contiene las facturas y la tabla "Formas de pago" las formas de pago?

    Cómo se declaró la columna fech_emis: ¿date? ¿datetime? ¿otro?

    He aquí una sugerencia para que la pruebes:

    -- código #1
    --
    declare @Inicio_ano date, @Termino_ano date;
    set @Inicio_ano= convert (date, '1/1/2000', 103);  -- dd/mm/aaaa
    set @Termino_ano= convert (date, '31/12/2000', 103);  -- dd/mm/aaaa
    
    --
    SELECT A.nume_fact, A.fech_emis, B.nomb_form 
      from [Encabezado Factura] as A
           inner join [Formas de Pago] as B on A.form_pago = B.form_pago
      where A.fech_emis between @Inicio_ano and @Termino_ano;

    He cambiado la cláusula WHERE para asegurar que el predicado sea sargable. Detalles en el artículo “Construindo códigos T-SQL eficientes”.

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Propuesto como respuesta Javi Fernández F sábado, 21 de septiembre de 2019 5:40
    • Marcado como respuesta Liss_ndg domingo, 22 de septiembre de 2019 4:15
    • Editado José Diz jueves, 3 de octubre de 2019 23:41
    viernes, 20 de septiembre de 2019 23:08
  • Hola Liss_ndg:

    El error es porque los identificadores de los nombres de los objetos no pueden llevar paréntesis. Para esto SQL server dispone de dos opciones. La primera y probablemente la mejor y más usada, la que te ha mostrado José Diz en su código, que es envolver el nombre de la tabla o columna entre corchetes, la segunda es hacerlo entre comillas dobles.

    Identificadores de base de datos

    https://docs.microsoft.com/es-es/sql/relational-databases/databases/database-identifiers?view=sql-server-2017

    Tu mismo código, se puede expresar como:

    CREATE TABLE [ENCABEZADO FACTURA] (NUME_FACT INT, FORM_PAGO INT, FECH_EMIS DATETIME)
    CREATE TABLE [FORMAS DE PAGO] (FORM_PAGO INT, NOMB_FORM VARCHAR(10))
    GO
    /* tablas creadas para el ejemplo */
    SELECT a.nume_fact, 
           a.fech_emis, 
           b.nomb_form
    FROM "Encabezado Factura" a
         INNER JOIN "Formas de Pago" b ON a.form_pago = b.form_pago
    WHERE YEAR(a.fech_emis) = 2000;

    Ahora bien, de este error, puedes sacar dos grandes sugerencias.

    Intenta que tus tablas o columnas no lleven espacio. Internamente se pueden llamar encabezadoFactura o encabezado_Factura y te evitarás muchos problemas. Las columnas igual a como lo están y si quieres darles salida con espacio pues con el alias (a.fech_emis as [fecha emisión]).

    Fíjate que en código que te han puesto, han omitido la función Year y lo que han utilizado es una serie de variables, para que el motor no tenga que realizar el código que utiliza la función en cada evaluación de cada fila. De este modo, sólo tiene que evaluar si algo es cierto o falso.


    • Marcado como respuesta Liss_ndg domingo, 22 de septiembre de 2019 4:15
    sábado, 21 de septiembre de 2019 5:39

Todas las respuestas

  • Listar los datos de facturas emitidas para el año 2000, en listado el número de factura

    ¿La tabla "Encabezado Factura" contiene las facturas y la tabla "Formas de pago" las formas de pago?

    Cómo se declaró la columna fech_emis: ¿date? ¿datetime? ¿otro?

    He aquí una sugerencia para que la pruebes:

    -- código #1
    --
    declare @Inicio_ano date, @Termino_ano date;
    set @Inicio_ano= convert (date, '1/1/2000', 103);  -- dd/mm/aaaa
    set @Termino_ano= convert (date, '31/12/2000', 103);  -- dd/mm/aaaa
    
    --
    SELECT A.nume_fact, A.fech_emis, B.nomb_form 
      from [Encabezado Factura] as A
           inner join [Formas de Pago] as B on A.form_pago = B.form_pago
      where A.fech_emis between @Inicio_ano and @Termino_ano;

    He cambiado la cláusula WHERE para asegurar que el predicado sea sargable. Detalles en el artículo “Construindo códigos T-SQL eficientes”.

     


    José Diz     Belo Horizonte, MG - Brasil     [query performance tuning: Porto SQL]


    Este conteúdo é fornecido sem garantias de qualquer tipo, seja expressa ou implícita.

    • Propuesto como respuesta Javi Fernández F sábado, 21 de septiembre de 2019 5:40
    • Marcado como respuesta Liss_ndg domingo, 22 de septiembre de 2019 4:15
    • Editado José Diz jueves, 3 de octubre de 2019 23:41
    viernes, 20 de septiembre de 2019 23:08
  • Hola Liss_ndg:

    El error es porque los identificadores de los nombres de los objetos no pueden llevar paréntesis. Para esto SQL server dispone de dos opciones. La primera y probablemente la mejor y más usada, la que te ha mostrado José Diz en su código, que es envolver el nombre de la tabla o columna entre corchetes, la segunda es hacerlo entre comillas dobles.

    Identificadores de base de datos

    https://docs.microsoft.com/es-es/sql/relational-databases/databases/database-identifiers?view=sql-server-2017

    Tu mismo código, se puede expresar como:

    CREATE TABLE [ENCABEZADO FACTURA] (NUME_FACT INT, FORM_PAGO INT, FECH_EMIS DATETIME)
    CREATE TABLE [FORMAS DE PAGO] (FORM_PAGO INT, NOMB_FORM VARCHAR(10))
    GO
    /* tablas creadas para el ejemplo */
    SELECT a.nume_fact, 
           a.fech_emis, 
           b.nomb_form
    FROM "Encabezado Factura" a
         INNER JOIN "Formas de Pago" b ON a.form_pago = b.form_pago
    WHERE YEAR(a.fech_emis) = 2000;

    Ahora bien, de este error, puedes sacar dos grandes sugerencias.

    Intenta que tus tablas o columnas no lleven espacio. Internamente se pueden llamar encabezadoFactura o encabezado_Factura y te evitarás muchos problemas. Las columnas igual a como lo están y si quieres darles salida con espacio pues con el alias (a.fech_emis as [fecha emisión]).

    Fíjate que en código que te han puesto, han omitido la función Year y lo que han utilizado es una serie de variables, para que el motor no tenga que realizar el código que utiliza la función en cada evaluación de cada fila. De este modo, sólo tiene que evaluar si algo es cierto o falso.


    • Marcado como respuesta Liss_ndg domingo, 22 de septiembre de 2019 4:15
    sábado, 21 de septiembre de 2019 5:39