Hacktoberfest 2026: los issues que los mantenedores marcaron para octubre, abiertos y aptos para principiantes. Explorar issues de Hacktoberfest

bulkcopy accepts four-part table names that SQL Server always rejects

Abierto Apto para principiantes
#843 1 comentario 0 reacciones 0 asignados Ver en GitHub

Los mantenedores suelen responder en 1 día

Nadie ha tomado este issue todavía.

Evaluación

Dificultad
2/5
Tiempo estimado
1-3 horas
Aptitud para principiantes
70/100
Tipo de issue
Error
Claridad
Bien especificado
Estado de actividad
Activo
Stack tecnológico
python, sql
Área
databases

Línea de trabajo

El límite de cantidad de partes es la constante MAX_PARTS en el analizador de identificadores de copia masiva, que actualmente permite cuatro partes; por ahí empieza el cambio. Reduce el límite a tres para que un destino de cuatro partes falle con el mismo error de uso que muestra el payload para cinco partes, antes de cualquier llamada al servidor. Está terminado cuando el caso de cuatro partes del repro lanza un error de uso sin llegar a la búsqueda de metadatos, y los casos de tres y cinco partes siguen comportándose como se describe.

Escrito por el modelo de indexación a partir del texto del issue.

Descripción

area: bulk-copy
Describe the bug

The 1.16.0 bulk copy identifier parser allows up to four name parts (MAX_PARTS is 4), so cursor.bulkcopy() accepts server.database.schema.table. SQL Server doesn't allow a server prefix on a bulk insert target, so every four-part name fails with error 117 after metadata lookup starts. A five-part name fails earlier, in the driver, with a clear usage error.

Exception message:
RuntimeError: Sql Error: 117: Class 15: State 1: The object name 'dlevy-sql25.test1.dbo.fp116' contains more than the maximum number of prefixes. The maximum is 2. on dlevy-sql25 in  at line 1

For comparison, a five-part name:

RuntimeError: Failed to retrieve destination metadata: Usage Error: Too many identifier parts: 5 (maximum is 4)
To reproduce
import os
import mssql_python

conn = mssql_python.connect(os.environ["SQL_CONNECTION_STRING"], timeout=30)
cur = conn.cursor()
cur.execute("CREATE TABLE dbo.fp116 (i int)")
conn.commit()

server = cur.execute("SELECT @@SERVERNAME").fetchval()
try:
    cur.bulkcopy(f"[{server}].test1.dbo.fp116", [(1,)])
except Exception as e:
    print(type(e).__name__, e)

try:
    cur.bulkcopy("a.b.c.d.e", [(1,)])
except Exception as e:
    print(type(e).__name__, e)

cur.execute("DROP TABLE dbo.fp116")
conn.commit()
Expected behavior

The parser should allow at most three parts for a bulk copy target and reject a four-part name with the same kind of usage error it gives for five parts, before it contacts the server. The current limit of four suggests linked-server targets work, but they can't.

Further technical details

Python version: 3.14.0
mssql-python: 1.16.0 (pip), default msodbcsql18 provider
SQL Server version: SQL Server 2025 (RTM-CU9) 17.0.5005.3, Enterprise Edition, EngineEdition 3
Operating system: Windows 11

Additional context

Found while documenting the 1.16.0 bulk copy identifier changes in MicrosoftDocs/sql-docs-pr#38337. The docs now list one-part through three-part names and say that SQL Server rejects the four-part form.

Lenguaje dominante
Python
Estrellas
478
Forks
62
Merge medio
3 d 1 h
PR fusionados (30 d)
27

Preparar el entorno

Abrir en Codespaces

Inicia el contenedor de desarrollo del proyecto en tu navegador, con tu propia cuenta de GitHub.

Primeros pasos

  1. Lee el issue completo y luego la guía de contribución del proyecto.
  2. Comenta en el issue que vas a ocuparte — evita que dos personas hagan lo mismo.
  3. Haz un fork del repositorio y trabaja en una rama.
  4. Abre un pull request que haga referencia al número del issue.

Más de microsoft/mssql-python

Todos los issues de microsoft/mssql-python

Issues similares

Más issues de Python

Recibe los nuevos issues en tu correo

Un resumen breve de issues de GitHub para principiantes.