Power Query中UTF-32表情符号M代码未被SAP HANA处理的解决方法
问题背景
我在Power Query中编写M代码,试图创建包含🚢的列,代码如下:
#"Added Column" = Table.AddColumn(#"PreviousStep", "Column Name", each Character.FromNumber(128674))
运行时出现ODBC语法错误,具体报错信息:
DataSource.Error: ODBC: ERROR [42000] [SAP AG][LIBODBCHDB DLL][HDBODBC] Syntax error or access violation; 257 sql syntax error: incorrect syntax near "🚢": line 36 col 5 (at pos 2176)
Details:
DataSourceKind = SapHana
DataSourcePath = xxx.xxx.xxx:xxx
OdbcErrors=[Table]
推测是Power Query无法正确处理UTF-32编码的表情符号,需要纯Power Query层面的解决方案,不使用DAX。完整M代码如下:
let Source = SapHana.Database(DataSource, [Implementation="2.0"]), Contents = Source{[Name="XX"]}[Data], Schema = Contents{[Name="Schema"]}[Data], Table = Schema{[Name="Table"]}[Data], #"Added Items" = Cube.Transform(Table, { {Cube.AddAndExpandDimensionColumn, "Table", {"columns"}, {"Columns Names"}} }), #"Added Column" = Table.AddColumn(#"Added Items", "Columns Name", each "🚢"), #"Added Column1" = Table.AddColumn(#"Added Column", "Column Name1", each "⭐"), #"Added Conditional Column" = Table.AddColumn(#"Added Column1", "Conditional Column Name", each if [XX] = "xx" then [XX] else null), #"Changed Type" = Table.TransformColumnTypes(#"Added Conditional Column",{{"XX", type datetime}}), #"Filtered Rows" = Table.SelectRows(#"Changed Type", each not Text.StartsWith([XXYY], "xxyy ")) in #"Filtered Rows"
解决方案
问题本质是Power Query将添加表情符号列的操作推送到了SAP HANA数据源执行,但HANA的ODBC驱动不支持解析UTF-32表情符号的语法。以下是两种纯Power Query的解决方法:
方法1:缓冲数据到本地,强制本地执行操作
在添加表情符号列之前,用Table.Buffer()把数据加载到本地内存,切断与数据源的实时关联,避免后续操作被推送到HANA执行。修改后的关键代码如下:
#"Added Items" = Cube.Transform(Table, { {Cube.AddAndExpandDimensionColumn, "Table", {"columns"}, {"Columns Names"}} }), // 新增缓冲步骤,将数据加载到本地 #"Buffered Data" = Table.Buffer(#"Added Items"), // 基于缓冲后的本地数据添加表情符号列 #"Added Column" = Table.AddColumn(#"Buffered Data", "Columns Name", each "🚢"),
方法2:使用UTF-16代理对生成表情符号
如果缓冲后仍有问题,可通过UTF-16代理对组合生成表情符号(🚢的UTF-16代理对为U+D83D和U+DEE2,对应十进制的55356和56530),替代直接输入表情符号或UTF-32编码:
#"Added Column" = Table.AddColumn(#"Buffered Data", "Columns Name", each Character.FromNumber(55356) & Character.FromNumber(56530)),
这种方式能确保Power Query在本地正确生成表情符号,避免直接传递表情符号字符串到数据源引发语法错误。
验证
替换代码后运行查询,检查错误是否消失,确认表情符号列正常显示。
内容的提问来源于stack exchange,提问作者Abdulrahman Hocaoglu

