使用变量的 Azure Synapse Analytics SQL 查询

Azure Synapse Analytics SQL Query with Variables

提问人:IrfanClemson 提问时间:6/22/2023 最后编辑:IrfanClemson 更新时间:6/22/2023 访问量:336

问:

我有一个包含复制活动的 Azure Synapse Analytics 管道。该活动从 Google BigQuery 数据源中提取数据。数据是根据几个条件提取的,包括开始日期和结束日期。以下是复制活动的“查询”部分中的问题查询:

 @concat('SELECT LogObject FROM `xxxx.yyyy.LogMetric` WHERE
 SourceApplication = '185' AND EventType = 'Request'  AND  TIMESTAMP(EventTime) BETWEEN  
 ','''', variables('begin_date'),'''', ' AND ', '''', variables('end_date'),'''' )

运行上述查询后,我收到如下错误:

'Type=System.Data.Odbc.OdbcException,Message=ERROR [42000] [Microsoft][BigQuery] (70) Invalid query: Syntax error: Expected end of input but got \"@\" at [1:1],Source=Microsoft ODBC Driver for Google BigQuery

更新 1如果我不使用@concat并且喜欢:

SELECT LogObject FROM LogMetric WHERE TIMESTAMP(EventTime) BETWEEN 
TIMESTAMP(@variables('begin_date') AND 
TIMESTAMP(@variables('end_date'));

然后我得到错误:

Function call cannot be applied to this expression. Function calls require a path, e.g. a.b.c()

如果我运行一个更简单的查询进行测试,那就行得通了:

SELECT LogObject FROM `xxxx.yyyy.LogMetric` WHERE
SourceApplication = '185' AND EventType = 'Request' LIMIT 5;' 

但是我需要能够使用这两个变量和 .begin_dateend_date

当复制活动中的数据源是 SQL Server 时,我能够使其正常工作;区别在于,对于 SQL Server,非日期筛选器是数字,例如:

@concat('Select LogObject from MyTable where AppRequestKeyId=185 and EventType=1 AND CAST 
(LogDate AS datetime2) BETWEEN  ','''', variables('begin_date'),'''', ' AND ', '''', 
variables('end_date'),'''' )

如何使我的查询也适用于包含变量的 Google BigQuery?

SQL 变量 google-bigquery azure-synapse

评论

0赞 hector-j-rivas 6/22/2023
您是否尝试过FORMAT_TIMESTAMP而不是 TIMESTAMP?你试试使用PARSE_TIMESTAMP怎么样?不确定错误消息,但在我看来,比较可能会产生不兼容的类型(TIMESTAMP 是一种类型,但不一定是与变量类型匹配的类型)。
0赞 IrfanClemson 6/22/2023
我使用“BETWEEN TIMESTAMP('2023-06-19') AND TIMESTAMP('2023-06-20')' 直接在 Google Cloud 中尝试了 TIMESTAMP(),但没有问题。我认为我的问题是用变量组成查询的字符串。
0赞 hector-j-rivas 6/22/2023
明白了;你走在正确的轨道上,然后:)它必须与表达式相关。您的原始查询在 '185 时看起来不正确,因为撇号将发出要连接的第一个值的结束信号(它也需要转义)。
0赞 IrfanClemson 6/22/2023
@hector-j-rivas谢谢。另请参阅 Update 1 以获取备用查询。我想用它来更接近吗?

答:

1赞 Aswin 6/22/2023 #1

更新的查询的问题在于,您正在使用函数内的符号来引用 和 变量的值。这不是引用变量的正确语法。@TIMESTAMPbegin_dateend_date

若要在 Azure Synapse Analytics 中引用变量,应使用以下语法:.请注意,变量名称应用单引号括起来,整个表达式应括在大括号 @{....} 中。@{variables('variable_name')}

以下是更正后的查询:

SELECT LogObject FROM LogMetric WHERE TIMESTAMP(EventTime) BETWEEN 
TIMESTAMP('@{variables('begin_date')}') AND 
TIMESTAMP('@{variables('end_date')}')

参考:关于ADF中表达式的MS文档

评论

0赞 IrfanClemson 6/22/2023
嗨,看起来很有前途。但现在我收到一个错误:“@variables('begin_date')'。但是如果我更改为 BETWEEN TIMESTAMP('''2023-06-19''') 和 TIMESTAMP('''2023-06-20''');然后它起作用了。
1赞 IrfanClemson 6/22/2023
哦,没关系。我有一些额外的单引号。你的答案有效。非常感谢!!