Limitaciones de go-mssqldb

Este artículo enumera las limitaciones y restricciones conocidas del go-mssqldb controlador.

No se soporta LastInsertId

El go-mssqldb controlador no soporta el database/sqlResult.LastInsertId() método. Llamarlo devuelve un error:

LastInsertId is not supported. Please use the OUTPUT clause or add
'select ID = convert(bigint, SCOPE_IDENTITY())' to the end of your query.

Solución temporal: Utiliza una OUTPUT cláusula en la INSERT sentencia o consulta SCOPE_IDENTITY() por separado.

No se soporta Múltiples Conjuntos de Resultados Activos (MARS)

El controlador no soporta MARS. Cada conexión solo puede tener una consulta o sentencia activa a la vez. Si necesitas hacer consultas concurrentes, usa conexiones separadas del pool.

Ámbito temporal de tabla con pooling de conexiones

El comportamiento temporal de las tablas sigue las reglas de alcance de SQL Server, pero el agrupamiento de conexiones cambia cómo aparece ese comportamiento en el código de la aplicación:

  • Las tablas temporales locales (#name) se delimitan a una sesión (conexión).
  • Las tablas temporales globales (##name) son visibles para otras sesiones mientras la sesión de creación permanece abierta.

Con , las database/sqlllamadas db.Exec separadas db.Query y pueden usar diferentes conexiones agrupadas. Una tabla temporal local creada en una llamada no es visible en la siguiente llamada cuando esa siguiente llamada se ejecuta en una conexión diferente.

Para las tablas temporales globales, la visibilidad entre conexiones funciona como se espera, pero las colisiones del ciclo de vida y de nombres aún requieren cuidado en cargas de trabajo concurrentes.

Guía: Utilizarlo db.Conn(ctx) para fijar operaciones relacionadas a una conexión, o envolver operaciones en una transacción. Utiliza tablas temporales globales solo cuando se requiera visible entre sesiones.

Para patrones de implementación, consulte Tablas temporales y procedimientos almacenados, Agrupación de conexiones y Tabla temporal no encontradas.

Restricciones siempre cifradas

  • Copia masiva con columnas cifradas: El controlador no soporta operaciones de copia masiva en tablas con columnas Siempre Cifradas.
  • Enclaves seguros: El controlador no soporta Always Encrypted con enclaves seguros.
  • Registro del proveedor: Debes importar el paquete de proveedor clave (localcert, akv) como una importación por efecto secundario. Sin él, el controlador no puede descifrar datos.
  • Coincidencia exacta del tipo de parámetro: Los parámetros cifrados deben coincidir estrechamente con el tipo de columna de SQL Server. Un Go string por defecto se convierte nvarcharen , que puede fallar contra tipos de parámetros cifrados más específicos.
  • Cifrado char y varchar texto: Las inserciones y actualizaciones contra cifrados char o varchar columnas están actualmente limitadas. Prefiero cifrado nchar o nvarchar columnas cuando necesitas Siempre Cifrado para datos de texto.

Versiones antiguas de SQL Server y TLS

Las versiones antiguas de SQL Server que no son compatibles pueden no soportar TLS 1.2 o posteriores. Al conectarse a estas versiones con encrypt=true, la conexión puede fallar si el servidor no puede negociar una versión TLS compatible.

Solución alternativa: Usa encrypt=false o actualiza a una versión compatible con SQL Server.

Nombre de controlador mssql obsoleto

El nombre mssql del controlador (usado con sql.Open("mssql", ...)) está obsoleto. Use sqlserver en su lugar:

// Deprecated
db, err := sql.Open("mssql", connString)

// Recommended
db, err := sql.Open("sqlserver", connString)

El nombre del mssql controlador realiza el reemplazo de tokens de parámetro, convirtiendo ? marcadores de posición a @p1, @p2, y nombres ordinales similares. El nombre del sqlserver controlador requiere parámetros explícitos y proporciona un comportamiento más predecible.

Si necesitas uso basado sql.OpenDB en conectores y debes preservar temporalmente el comportamiento heredado de reescritura de texto de consulta, usa NewConnectorWithProcessQueryText. Para código nuevo, prefiero el nombre del sqlserver controlador y parámetros explícitos.

columnas uniqueidentifier

El controlador devuelve uniqueidentifier valores de columna como arrays en bruto []byte por defecto. Úsala mssql.UniqueIdentifier como destino de escaneo para obtener cadenas estándar con formato GUID.

Sin compatibilidad con ODBC

El controlador es una implementación pura de Go y no utiliza ni depende de unixODBC, FreeTDS ni del controlador ODBC de Microsoft. No están disponibles funciones específicas de ODBC (configuración DSN, trazado ODBC).

Conexiones de tuberías nombradas

Las conexiones de tuberías nombradas pueden requerir permisos específicos del sistema de archivos en el endpoint de la tubería. En Linux, el cliente SMB debe configurarse para el acceso a tuberías nombradas.

Precisión de flotación

El tipo de float64 Go proporciona aproximadamente entre 15 y 16 dígitos decimales significativos. Los SQL Server decimal y numeric tipos pueden representar hasta 38 dígitos de precisión. Al escanear decimal/numeric columnas en float64, puede producirse pérdida de precisión para valores con más de 15 dígitos significativos.

Solución alternativa: Escanear decimal/numeric columnas y string usar una biblioteca decimal de terceros como shopspring/decimal (github.com/shopspring/decimal) o cockroachdb/apd (github.com/cockroachdb/apd) para cálculos precisos. Para patrones, véase Mapeos de tipos de datos.