2011-09-15 16 views
27

me he encontrado con la siguiente T-SQL:Las llaves en T-SQL

SELECT {d'9999-12-31'} 

que devuelve 9999-12-31 00:00:00.000.

Esto parece estar convirtiendo el tipo del literal de cadena en DATETIME. No puedo encontrar ninguna documentación sobre esta sintaxis y me pregunto si hay alguna variación, por ejemplo si tengo un literal 1 pero quiero representar esto en un BIGINT sin usar CONVERT()/CAST().

¿Alguien puede proporcionar más información sobre esta sintaxis? Gracias.

+0

intento SELECT {i'9999-12-31' } '. como puede ver, hay un error al afirmar que 'i' no es una opción para la extensión de fecha/hora ODBC. intente google para algo como eso – rabudde

+2

Esto se conoce como el formato de fecha y hora de ODBC. –

Respuesta

42

Estas son las secuencias de escape ODBC. Ver Date, Time, and Timestamp Escape Sequences para más detalles.

También hay sintaxis similar para uniqueidentifiers

SELECT {guid '00000000-0000-0000-0000-000000000000'},

así como llamadas de procedimiento y algunas otras construcciones detalladas de ese enlace.

Respecto al resto de su pregunta, no conozco ninguna forma de tener un literal entero tratado como bigint ni de ningún recurso en particular que enumere todas las formas de influenciar cómo SQL Server asigna los tipos de datos. Algunas formas están abajo.

;WITH cte(thing) AS 
(
SELECT CAST(1 AS SQL_VARIANT) UNION ALL 
SELECT $1 UNION ALL 
SELECT 1e0 UNION ALL 
SELECT 1.0000 UNION ALL 
SELECT 2147483648 UNION ALL 
SELECT {ts '2011-09-15 01:23:56.123'} UNION ALL 
SELECT {d '2011-09-15'} UNION ALL 
SELECT { t '13:33:41' } UNION ALL 
SELECT {guid '00000000-0000-0000-0000-000000000000'} UNION ALL 
SELECT 'Foo' UNION ALL 
SELECT N'Foo' 
) 
SELECT thing, 
     sql_variant_property(thing,'basetype') AS basetype, 
     sql_variant_property(thing,'precision') AS precision, 
     sql_variant_property(thing,'scale') AS scale, 
     sql_variant_property(thing,'maxlength') AS maxlength 
FROM cte 

devoluciones

thing       basetype   precision scale maxlength 
------------------------------ ------------------- ----------- ------ --------- 
1        int     10   0  4 
1.00       money    19   4  8 
1        float    53   0  8 
1.0000       numeric    5   4  5 
2147483648      numeric    10   0  5 
2011-09-15 01:23:56.123  datetime   23   3  8 
2011-09-15 00:00:00.000  datetime   23   3  8 
2011-09-15 13:33:41.000  datetime   23   3  8 
00000000-0000-0000-0000-000000 uniqueidentifier 0   0  16 
Foo       varchar    0   0  3 
Foo       nvarchar   0   0  6 
+0

Gracias @Martin. ¿Hay alguna razón por la que el uso de esta sintaxis podría no ser una buena idea? ¿Es menos compatible/compatible que SQL "estándar"? –

+0

@Tom - No tengo idea de eso. Un google para "secuencias de escape de ODBC" trae un montón de cosas no relacionadas con SQL Server, así que parece bastante implementado de manera estándar, ¡pero no sé nada más sobre esto realmente! –