Conexión de bucle invertido con SQL Server desde un script de Python o R

Se aplica a: SQL Server 2019 (15.x) Azure SQL Managed Instance

Obtenga información sobre cómo usar una conexión de bucle invertido con Machine Learning Services para volver a conectar con SQL  Server a través de ODBC a fin de leer o escribir datos de un script de Python o R ejecutado desde sp_execute_external_script. Se puede utilizar cuando no sea posible usar los argumentos InputDataSet y OutputDataSet de sp_execute_external_script.

Cadena de conexión

Para crear una conexión de bucle invertido, debe usar una cadena de conexión correcta. Los argumentos obligatorios comunes son el nombre del controlador ODBC, la dirección del servidor y el nombre de la base de datos.

Cadena de conexión en Windows

Para la autenticación en SQL Server en Windows, el script de Python o R puede usar el atributo de cadena de conexión Trusted_Connection para autenticarse como el mismo usuario que ejecutó sp_execute_external_script.

Este es un ejemplo de la cadena de conexión de bucle invertido en Windows:

"Driver=SQL Server;Server=.;Database=nameOfDatabase;Trusted_Connection=Yes;"

Cadena de conexión en Linux

Para la autenticación en SQL Server en Linux, el script de Python o R debe utilizar los atributos ClientCertificate y ClientKey del controlador ODBC para autenticarse como el mismo usuario que ejecutó sp_execute_external_script. Esto requiere el uso del controlador ODBC más reciente versión 17.4.1.1.

Este es un ejemplo de la cadena de conexión de bucle invertido en Linux:

"Driver=ODBC Driver 17 for SQL Server;Server=fe80::8012:3df5:0:5db1%eth0;Database=nameOfDatabase;ClientCertificate=file:/var/opt/mssql-extensibility/data/baeaac72-60b3-4fae-acfd-c50eff5d34a2/sqlsatellitecert.pem;ClientKey=file:/var/opt/mssql-extensibility/data/baeaac72-60b3-4fae-acfd-c50eff5d34a2/sqlsatellitekey.pem;TrustServerCertificate=Yes;Trusted_Connection=no;Encrypt=Yes"

La dirección del servidor, la ubicación del archivo de certificado de cliente y la ubicación del archivo de clave de cliente son únicas para cada sp_execute_external_script y se pueden obtener mediante el uso de la API rx_get_sql_loopback_connection_string() para Python o rxGetSqlLoopbackConnectionString() para R.

Para obtener más información sobre los atributos de la cadena de conexión, consulte Palabras clave y atributos de DSN y de la cadena de conexión para Microsoft ODBC Driver for SQL Server.

Cadena de conexión en Azure SQL Managed Instance

Para generar la cadena de conexión para Azure SQL Managed Instance, vea los ejemplos de las secciones siguientes. Utilice ODBC Driver 11 for SQL Server como controlador ODBC para las conexiones de bucle invertido.

Generación de una cadena de conexión con revoscalepy para Python

Puede usar la API rx_get_sql_loopback_connection_string() en revoscalepy con el fin de generar una cadena de conexión correcta para una conexión de bucle invertido en un script de Python.

Acepta los argumentos siguientes:

Argumento Descripción
name_of_database Nombre de la base de datos con la que se va a realizar la conexión
odbc_driver Nombre del controlador ODBC

Ejemplos

Ejemplo para SQL Server en Windows:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="SQL Server", name_of_database="DBName")
print("Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Ejemplo para SQL Server en Linux:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="ODBC Driver 17 for SQL Server",
                                                                   name_of_database="DBName")
print("Loopback Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Ejemplo para Azure SQL Managed Instance:

EXECUTE sp_execute_external_script
@language = N'Python',
@script = N'
from revoscalepy import rx_get_sql_loopback_connection_string, RxSqlServerData, rx_data_step
loopback_connection_string = rx_get_sql_loopback_connection_string(odbc_driver="ODBC Driver 11 for SQL Server", name_of_database="DBName")
print("Connection String:{0}".format(loopback_connection_string))
data_set = RxSqlServerData(sql_query = "select col1, col2 from tableName",
                           connection_string = loopback_connection_string)
OutputDataSet = rx_data_step(data_set)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Generación de una cadena de conexión con RevoScaleR para R

Puede usar la API rxGetSqlLoopbackConnectionString() en RevoScaleR para generar una cadena de conexión correcta para una conexión de bucle invertido en un script de R.

Acepta los argumentos siguientes:

Argumento Descripción
nameOfDatabase Nombre de la base de datos con la que se va a realizar la conexión
odbcDriver Nombre del controlador ODBC

Ejemplos

Ejemplo para SQL Server en Windows:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <- rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", odbcDriver ="SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName",
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Ejemplo para SQL Server en Linux:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <-  rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", 
                                                                  odbcDriver ="ODBC Driver 17 for SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName", 
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Ejemplo para Azure SQL Managed Instance:

EXECUTE sp_execute_external_script
@language = N'R',
@script = N'
    loopbackConnectionString <- rxGetSqlLoopbackConnectionString(nameOfDatabase="DBName", odbcDriver ="ODBC Driver 11 for SQL Server")
    print(paste("Connection String:", loopbackConnectionString))
    dataSet <- RxSqlServerData(sqlQuery = "select col1, col2 from tableName",
                               connectionString = loopbackConnectionString)
    OutputDataSet <- rxDataStep(dataSet)
'
WITH RESULT SETS ((col1 int, col2 int))
GO

Pasos siguientes