使用动态表用 pandas 解析 SQL 参数标记
Parse SQL parameter marker with pandas using dynamic tables
我有以下代码:
query = """
DECLARE @DATABASE VARCHAR(128) = '{}';
DECLARE @SCHEMA VARCHAR(128) = '{}';
DECLARE @TABLE VARCHAR(128) = '{}';
DECLARE @sql VARCHAR(200) =
'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE), ' WHERE COD = ?')
EXEC sp_executesql @sql
""".format(
db_config.db.database, db_config.db.schema, db_config.db.table
)
return pd.read_sql_query(
query, db_config.db.connection, params=[cod_sol]
)
在我添加 sql 参数标记 ' WHERE COD = ?'
之前,它一直在正常工作。似乎 pandas 或 pyodbc 无法解析该类型的查询,使用简单的 sql 语句就可以,但不适用于动态表。
这是最终 @sql
变量的结果:
SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?
看来是对的。
这种事情可以做吗?
我已经解决了!
我没有尝试一步直接执行 sql 语句,而是首先构造 sql 查询,并生成其最终形式:
SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?
然后,我调用read_sql_query
传递参数
query = """
DECLARE @DATABASE VARCHAR(128) = '{}';
DECLARE @SCHEMA VARCHAR(128) = '{}';
DECLARE @TABLE VARCHAR(128) = '{}';
DECLARE @sql NVARCHAR(200) =
'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE)) WHERE COD = ?;
SELECT @sql
""".format(
db_config.db.database, db_config.db.schema, db_config.db.table
)
con = db_config.db.connection
query = con.execute(query).fetchval()
# Now this is working
pd.read_sql_query(query, con, params=[cod_xml]).reset_index(drop=True)
我有以下代码:
query = """
DECLARE @DATABASE VARCHAR(128) = '{}';
DECLARE @SCHEMA VARCHAR(128) = '{}';
DECLARE @TABLE VARCHAR(128) = '{}';
DECLARE @sql VARCHAR(200) =
'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE), ' WHERE COD = ?')
EXEC sp_executesql @sql
""".format(
db_config.db.database, db_config.db.schema, db_config.db.table
)
return pd.read_sql_query(
query, db_config.db.connection, params=[cod_sol]
)
在我添加 sql 参数标记 ' WHERE COD = ?'
之前,它一直在正常工作。似乎 pandas 或 pyodbc 无法解析该类型的查询,使用简单的 sql 语句就可以,但不适用于动态表。
这是最终 @sql
变量的结果:
SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?
看来是对的。
这种事情可以做吗?
我已经解决了!
我没有尝试一步直接执行 sql 语句,而是首先构造 sql 查询,并生成其最终形式:
SELECT * FROM [DB].[SCHEMA].[TABLE] WHERE COD = ?
然后,我调用read_sql_query
传递参数
query = """
DECLARE @DATABASE VARCHAR(128) = '{}';
DECLARE @SCHEMA VARCHAR(128) = '{}';
DECLARE @TABLE VARCHAR(128) = '{}';
DECLARE @sql NVARCHAR(200) =
'SELECT * FROM ' + CONCAT(QUOTENAME(@DATABASE), '.', QUOTENAME(@SCHEMA), '.', QUOTENAME(@TABLE)) WHERE COD = ?;
SELECT @sql
""".format(
db_config.db.database, db_config.db.schema, db_config.db.table
)
con = db_config.db.connection
query = con.execute(query).fetchval()
# Now this is working
pd.read_sql_query(query, con, params=[cod_xml]).reset_index(drop=True)