none
En T-SQL, ¿Qué función tiene el punto y coma (;)?¡ RRS feed

  • Pregunta

  • Parece una pregunta tonta, pero veo que algunos lo utilizan, otro no recurren al punto y coma, en realidad, ¿Qué función tiene el

    punto y coma en T-SQL?


    IIslas Master Consultant SQL Server

    sábado, 13 de marzo de 2021 18:10

Todas las respuestas

  • Hola iislas:

    Cerrar las sentencias. 

    De momento se admiten sin ella, salvo algunas especiales, como la instrucción anterior a With, y el cierre de algunas transacciones (trhow), merge, donde es obligatorio hacerlo.

    Simplemente porque Microsoft ya ha documentado en varios sitios, que en alguna versión futura lo va a deprecar, por tanto las sentencias TSQL sin punto y coma, dejarán de funcionar.

    En la sección Características en desuso en una versión futura de SQL Server

    https://docs.microsoft.com/es-es/sql/database-engine/deprecated-database-engine-features-in-sql-server-2016?view=sql-server-ver15

    Aunque te he puesto el enlace de SQL Server 2016, realmente esto ya lleva más versiones (quizá desde 2005)

    Ocurre lo mismo que con datetime. Llevan mucho tiempo avisando, y no hacemos mucho caso. El día que pase a estar obsoleta, nos llevaremos un buen susto.

    Un debate interesante al respecto.

    https://social.msdn.microsoft.com/Forums/sqlserver/en-US/a2120ec3-fadc-4e4b-857c-8fb2242a38f6/statement-terminator-documentation?forum=transactsql


    domingo, 14 de marzo de 2021 6:35
  • El día que pase a estar obsoleta, nos llevaremos un buen susto.
    Dudo que lo puedan cambiar en muchísimo, pero que muchísimo tiempo, por mucho que lleven años avisándolo, si no quieren encontrarse con una revuelta entre sus clientes. Existen millones y millones y más millones de líneas de código SQL en producción, algunas heredadas desde los tiempos del SQL Server 6 (estamos hablando de hace unos 25 años más o menos). La cantidad de cosas que se romperían si Microsoft hiciese de repente obligatorio el punto y coma sería espeluznante. Ríete tú del efecto 2000 y otras minucias por el estilo.
    domingo, 14 de marzo de 2021 10:02
  • Como siempre, muchas gracias Javi, mi pregunta fue porque tengo un proceso que llevaba muchos puntos y comas, se las quite todas y realizo mas rápido lo que tenia que hacer, ¿Tendra algun efecto en el tiempo de respuesta?, Saludos

    IIslas Master Consultant SQL Server

    lunes, 15 de marzo de 2021 21:58
  • Tienes mucha razon, yo me encontre con mucho codigo "viejo" en un sistema de SAP, cuando lo comente con la gente de Microsoft, me dijeron que no iban a cambiar el codigo ya que habia miles de sistemas instalados de SAP, caso cerrado, gracias por el comentario

    IIslas Master Consultant SQL Server

    lunes, 15 de marzo de 2021 21:59
  • Hola iislas:

    ¿Tendra algun efecto en el tiempo de respuesta?

    No. Lo que tendrá es que se ha reaprovechado de algún plan de ejecución. Un ejemplo.

    CREATE TABLE dbo.ejA 
    (
    	id			uniqueidentifier primary key,
    	myValue		varchar(100),
    	myDate		datetime2
    );
    GO
    --Llenamos la tabla
      WITH
      L0   AS (SELECT c FROM (SELECT 1 UNION ALL SELECT 1) AS D(c)),
      L1   AS (SELECT 1 AS c FROM L0 AS A CROSS JOIN L0 AS B),
      L2   AS (SELECT 1 AS c FROM L1 AS A CROSS JOIN L1 AS B),
      L3   AS (SELECT 1 AS c FROM L2 AS A CROSS JOIN L2 AS B),
      L4   AS (SELECT 1 AS c FROM L3 AS A CROSS JOIN L3 AS B),
      L5   AS (SELECT 1 AS c FROM L4 AS A CROSS JOIN L4 AS B),
      Nums AS (SELECT ROW_NUMBER() OVER(ORDER BY (SELECT NULL)) 
    AS rownum
              FROM L5)
    INSERT INTO dbo.ejA (id, myValue, myDate)
      SELECT TOP(100000) newid(), cast(newid() as varchar(36)), CURRENT_TIMESTAMP
      FROM Nums
      ORDER BY rownum;
    GO

    Una tabla con una serie de columnas. (No importa ni la cantidad, ni el tipo).

    Limpiamos la cache de planes de ejecución (No hacer en producción).

    DBCC FREEPROCCACHE WITH NO_INFOMSGS;
    GO

    Ejecutamos prueba 1 (--myValue)

    SELECT TOP(1) id, myValue, myDate 
    	FROM dbo.ejA;
    

    Ejecutamos prueba 2

    SELECT TOP(1) id, myValue, myDate 
    	FROM dbo.ejA

    Misma sentencia que prueba 1 pero sin punto y coma.

    Ejecutamos prueba 3

    SELECT TOP(1) id, MyValue, MyDate 
    	FROM dbo.ejA;

    Ahora hemos cambiado myValue por MyValue y myDate por MyDate

    Buscamos los planes de ejecución generados.

    SELECT t.[text], p.size_in_bytes, p.usecounts
    
    FROM sys.dm_exec_cached_plans AS p
    CROSS APPLY sys.dm_Exec_sql_text(p.plan_handle) AS t
    WHERE LOWER(t.[text]) LIKE N'%dbo.ejA%';

    Y ha generado uno para cada sentencia, porque son diferentes. 

    Los planes diferencian mayúsculas de minúsculas y también si contienen puntos y comas o no.

    Por tanto te ha podido aplicar otro/s planes de ejecución que se hayan visto favorecidos, pero no por el punto y coma.

    martes, 16 de marzo de 2021 6:04
  • Nuevamente, muchas gracias Javi, siempre muy bien documentado

    IIslas Master Consultant SQL Server

    martes, 16 de marzo de 2021 16:53