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).
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í:
Este enfoque debería formatear correctamente el parámetro @key y evitar cualquier error de sintaxis en el script de Python.