Escribir instrucciones Transact-SQL internacionales

Se aplica a: SQL Server Azure SQL Database Azure SQL Managed Instance Azure Synapse Analytics Analytics Platform System (PDW)

Las bases de datos y las aplicaciones de bases de datos que utilizan instrucciones Transact-SQL obtendrán una mayor portabilidad de un idioma a otro, o admitirán varios idiomas, si se siguen estas directrices:

  • A partir de SQL Server 2019 (15.x) y en la base de datos de Azure SQL, usa:

    • Los tipos de datos char, varchar y varchar(max) con una intercalación compatible con UTF-8 y los datos se codifican con UTF-8.
    • Los tipos de datos nchar, nvarchar y nvarchar(max) con una intercalación habilitada para caracteres complementarios (SC), y los datos se codifican con UTF-16. El uso de una intercalación que no sea de SC da como resultado la codificación de los datos mediante UCS-2.

    Esto evita problemas de conversión de página de códigos. Para otras consideraciones, consulte Diferencias de almacenamiento entre UTF-8 y UTF-16.

  • Hasta SQL Server 2017 (14.x), reemplace todos los usos de los tipos de datos char, varchar y varchar(max) por nchar, nvarchar y nvarchar(max). Si usa una intercalación habilitada para caracteres complementarios (SC), los datos se codifican con UTF-16. El uso de una intercalación que no sea de SC da como resultado la codificación de los datos mediante UCS-2. Esto evita problemas de conversión de página de códigos. Para obtener más información, consulte Soporte técnico de intercalación y Unicode.

    Importante

    El tipo de datos text está en desuso y no debe usarse en nuevos trabajos de desarrollo. Planee la conversión de datos de tipo text a varchar (max).

  • Cuando realice comparaciones y operaciones con los meses y días de la semana, utilice las partes numéricas de la fecha en lugar de cadenas de nombres. Las distintas configuraciones de idioma devuelven nombres diferentes para los meses y los días de la semana. Por ejemplo, DATENAME(MONTH,GETDATE()) devuelve May cuando el idioma está establecido en inglés de EE.UU. Mai cuando el idioma es alemán y mai cuando el idioma es francés. En su lugar, utilice una función como DATEPART que utiliza el número del mes en lugar del nombre. Utilice los nombres DATEPART cuando genere conjuntos de resultados que se van a mostrar al usuario ya que, generalmente, los nombres de fecha resultan más significativos que una representación numérica. No codifique, sin embargo, ninguna lógica que dependa de que los nombres mostrados estén en un idioma determinado.

  • Cuando especifique fechas en las comparaciones o como entrada de las instrucciones INSERT o UPDATE, utilice constantes que se interpretan igual en todas las configuraciones de idioma:

    • Las aplicaciones ADO, OLE DB y ODBC deben utilizar la siguiente marca de tiempo, fecha y cláusulas de escape de hora ODBC:

      { ts' yyyy - mm - dd hh : mm : ss [.fff] '} such as: { ts'1998-09-24 10:02:20'}

      { d' yyyy - mm - dd '} such as: { d'1998-09-24'}

      { t' hh : mm : ss '} such as: { t'10:02:20'}

    • Las aplicaciones que utilizan otras API o desencadenadores, procedimientos almacenados y scripts de Transact-SQL deben utilizar las cadenas numéricas sin separar. Por ejemplo, yyyymmdd como en 19980924.

    • Las aplicaciones que usan otras API o scripts, procedimientos almacenados y desencadenadores de Transact-SQL deben usar la instrucción CONVERT con un parámetro de estilo explícito para todas las conversiones entre los tipos de datos time, date, smalldate, datetime, datetime2 y datetimeoffset, y los tipos de datos de cadenas de caracteres. Por ejemplo, la siguiente instrucción se interpreta igual en todas las configuraciones de conexión de formato de fecha o de idioma:

      SELECT *  
      FROM AdventureWorks2022.Sales.SalesOrderHeader  
      WHERE OrderDate = CONVERT(DATETIME, '20060719', 101)  
      

Consulte también

CAST y CONVERT (Transact-SQL)
DATEPART (Transact-SQL)
Compatibilidad con la intercalación y Unicode