使用 Python 将 SQL 输出读取到 SAS 数据集时出现问题

Issue while reading SQL output into SAS dataset using Python

我正在尝试读取 SQL 查询输出并使用 Python pandas 创建 SAS 数据集。我的 SQL 查询执行正常,但由于数据移动,仅将列名导入 SAS 数据集。这是一个编码问题,我想要一些关于如何解决这个问题的指导。下面是我的代码:

with open ('Query.sql', mode = 'r', encoding='utf-8-sig') as sql_input:
    sql_input = sql_input.read()

My_string = str('mssql+pyodbc://USER:Pass' + server + '/' + database + '?driver=SQL+Server+Native+Client+11.0')
engine = My_engine(My_string) 

df = pd.read_sql_query(sql_input,engine)

Viya = saspy.SASsession(omruser='User', omrpw='PWD', cfgfile='cfgfile.py')
Viya.submit('libname lib "path";') 
Viya.df2sd(df=df3, table='Test', libref='lib') 

然后我创建 SAS Viya 会话并提交路径和数据集名称。当我检查 SAS 数据集时,我只看到创建的列。

Error : INPUT statement exceeded record length. INFILE CARDS OPTION STOPOVER specified.

有什么建议吗?

首先,我猜测您可能在数据中嵌入了一些换行符。

请参阅 this github issue,其中包含与您相同的错误消息。 (另请注意初始 post 中的详细信息 - 这就是您的初始 post 应该是什么样子的!)

如果你的SASPy版本至少是3.1.4,你应该有一个选项embedded_newlines=true你可以设置,示例代码:

sas.dataframe2sasdata(df=problematic_data,table='via_sas_test_prob',libref='OUT', embedded_newlines=True)

(顺便说一下,这是 df2sd 的别名)。希望这在 Viya 有效; SASPy 主要是 运行s base (MVA) SAS,所以我不知道 Viya 有什么不同(并且没有 Viya)​​。如果您没有 3.1.4 或更新版本,请更新您的 SASPy。

另一种选择是在传输数据之前删除 Python 中的换行符 (\n)。这就是 github 问题中的用户所做的。

其次,如果您运行在 Viya 中使用,请考虑使用 python-SWAT,它是 Python 中的 SAS Viya 脚本库。它以 CAS 动作提交东西,这可能更适合你。

最后,第三个选项是 运行 SAS 中的数据库连接部分。当然,除非您没有授予 ODBC 的 ACCESS 许可,但如果您获得许可,那么我会考虑将该部分移至 SAS 并告诉 SAS 自己输入文件。