es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Parámetro SQL en script de Python en procedimiento SQL

Estoy tratando de usar SQL dinámico pasado a Python para su ejecución, pero no puedo conseguir la combinación de comillas correcta para @key. Aquí está el procedimiento:

create procedure [dbo].[pr_select_to_html_table]
(
    @key        varchar(100),
    @sql_query  nvarchar(max) = null
)
AS

DECLARE @NewScript NVARCHAR(MAX) 
SET @NewScript  = N'
import pandas as pd
import pyodbc

def exec_sql (query) :
    # execute sql query with no return
    cnxn_p = pyodbc.connect("driver={odbc driver 17 for sql server};server=localhost;DATABASE=trader;trusted_connection=yes;")
    cursor_p = cnxn_p.cursor()
    try:
        cursor_p.execute(query)
    except pyodbc.Error as err:
            print(err)
    cnxn_p.commit()

# Read Data From Input @input_data_1 
df = my_input_data
df.index = df.index+1

result = df.to_html()
sql = "insert into wrk.html_table (key,html_result) values (''' + @key + ''', ''' + result + '''')"
exec_sql(sql)
'

EXEC sp_execute_external_script
  @language = N'Python'
, @Script = @NewScript
, @input_data_1 = @sql_query
, @input_data_1_name = N'my_input_data'

Python proporciona dos errores, el primero, que creo que no se aplica es: UserWarning: Pandas no permite que se creen columnas a través de un nuevo nombre de atributo – ver https://pandas.pydata.org/pandas-docs/stable/indexing.html#attribute-access setattr(result, “var_info”, var_info)

El segundo error de Python es: (‘42000’, “[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near the keyword ‘key’. (156) (SQLExecDirectW)”)

Triple comillas simples no funcionan, tampoco funciona comilla doble simple.

(Sí, estoy pasando SQL desde SQL Server a Python, para luego conectarme a SQL Server y ejecutar el SQL. El método to_html() merece el esfuerzo).

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El problema radica en la sintaxis correcta para pasar el parámetro @key a la declaración SQL en el script de Python. El mensaje de error indica que hay un problema de palabra clave con el parámetro @key.

    Las comillas simples triples y las comillas simples dobles simples no funcionan para la declaración SQL. Para formatear correctamente el parámetro @key, el enfoque recomendado es utilizar la función REPLACE() para reemplazar cualquier comilla simple en la variable @key por dos comillas simples. Esto escapará las comillas simples y evitará cualquier error de sintaxis.

    La declaración SQL actualizada en el script de Python se vería así:

    sql = "insert into wrk.html_table (key,html_result) values (''' + REPLACE(@key, '''', '''''') + ''',''' + result + ''')"
    

    Este enfoque debería formatear correctamente el parámetro @key y evitar cualquier error de sintaxis en el script de Python.

Comments are closed.