突触:突触参数中带有空格的表出现问题

问题描述 投票:0回答:1

我有一个在 SSMS 中运行良好的动态查询,这意味着在 SSMS 中使用以下查询来获取列。

DECLARE @s NVARCHAR(MAX) = NULL
DECLARE @tablename NVARCHAR(500) = '@{pipeline().parameters.table_name}'
DECLARE @watermark NVARCHAR(1000) = '@{pipeline().parameters.watermark}'
DECLARE @period_back_from_utcnow NVARCHAR(500) = '@{pipeline().parameters.period_back_from_utcnow}'


SELECT @s = ISNULL(@s + ', ', '') + '[' + c.name + ']' + ' as [' + REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(c.name, ' ', '_'), '(', ''), ')', ''), '.', ''), '/', '') + ']' 
FROM sys.all_columns c 
JOIN sys.views t ON c.object_id = t.object_id 
WHERE t.name = @tablename


SELECT CONCAT('SELECT ', @s, ' FROM ', @tablename) AS Query



但是当我根据表名称中包含空格的图片使用表名称参数时,我收到如下错误: { “错误代码”:“2200”, “message”:“失败发生在“源”端。ErrorCode = SqlOperationFailed,'Type = Microsoft.DataTransfer.Common.Shared.HybridDeliveryException,Message =数据库操作失败,并出现以下错误:'关键字'FROM'附近的语法不正确.',Source=,''Type=System.Data.SqlClient.SqlException,Message=关键字“FROM”附近的语法不正确。,Source=.Net SqlClient 数据提供程序,SqlErrorNumber=156,Class=15,ErrorCode=-2146232060 ,State=1,Errors=[{Class=15,Number=156,State=1,Message=关键字“FROM”附近的语法不正确。,},],'", "failureType": "用户错误", "target": "bpw表到adls登陆", “细节”: [] }

执行后我可以看到输入的 json 为: { “来源”: { “类型”:“SqlServerSource”, "sqlReaderQuery": "从货币汇率表中选择", “查询超时”:“02:00:00”, “分区选项”:“无” }, “下沉”: { “类型”:“镶木地板水槽”, “商店设置”:{ “类型”:“AzureBlobFSWriteSettings” }, “格式设置”:{ “类型”:“ParquetWriteSettings” } }, “enableStaging”:假, “并行副本”:5, “译者”:{ "type": "表格翻译器", “类型转换”:真, “类型转换设置”:{ “允许数据截断”:true, “treatBooleanAsNumber”:假 } } }

我们可以清楚地看到 Select 语句没有获取任何列。 我尝试使用不同类型的串联和封装来更改参数,但没有成功。 我尝试更改表名变量声明,如下所示。尽管可以按照上面提到的方式创建输入 json,但使用单引号,但在表达式生成器的 SQL 中没有提取任何列:

  1. 声明 @tablename NVARCHAR(500) = CONCAT('''', @{pipeline().parameters.table_name}, '''')
  2. 通过硬编码尝试:DECLARE @tablename NVARCHAR(500) = CONCAT('''', 货币汇率表, '''')

注意:连接和链接服务正确且没有问题。

我尝试使用不同类型的串联和封装来更改参数,但没有成功。 我尝试更改表名变量声明,如下所示。尽管可以按照上面提到的方式创建输入 json,但使用单引号,但在表达式生成器的 SQL 中没有提取任何列:

  1. 声明 @tablename NVARCHAR(500) = CONCAT('''', @{pipeline().parameters.table_name}, '''')
  2. 通过硬编码尝试:DECLARE @tablename NVARCHAR(500) = CONCAT('''', 货币汇率表, '''')

期望:关于如何处理 SQL Server 数据库中包含空格的表的任何见解。当表名没有任何空格时,上面提到的脚本工作得很好,就像如果它是Currency_table,它就会工作。

parameters azure-data-factory expression azure-synapse-analytics azure-synapse-pipeline
1个回答
0
投票

有关如何处理 SQL Server 数据库中包含空格的表的任何见解。

如果您的对象名称(表名称、列名称、过程名称等)包含空格,那么您需要将其括在

[]
中。

您可以使用以下表达式在表名称周围添加

[]

@{concat('[',pipeline().parameters.table_name,']')}

这里我在查找查询中尝试了类似的表达式。

enter image description here

提供参数值作为带空格的表名。

enter image description here

获得正确的结果。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.