如何在不指定列的情况下使用 Synapse 中的变量创建外部表

How to create an external table using variables in Synapse without specifying columns

提问人:Rchee 提问时间:11/11/2023 更新时间:11/15/2023 访问量:47

问:

我在Synapse专用池中有一个存储过程,它从adls获取parquet文件,并在专用池中创建一个临时表:

ALTER PROCEDURE dbo.Staging_Tables_sp
(
    @TableName VARCHAR(MAX),
    @SchemaName VARCHAR(MAX)
)
AS
BEGIN

    EXEC ('SET ANSI_NULLS ON;
    SET QUOTED_IDENTIFIER ON;
   
    CREATE EXTERNAL TABLE [' + @SchemaName + '].[Staging_' + @TableName +']
    WITH (
    LOCATION = N''/Folder/ParquetFiles/' + @TableName + '/'',
    DATA_SOURCE = [gold_parquet],
    FILE_FORMAT = [ParquetFormat],
    REJECT_TYPE = VALUE,
    REJECT_VALUE = 0)');
END

执行语句:

DECLARE @TableName varchar(max)
DECLARE @SchemaName varchar(max)
 
 
 EXECUTE [dbo].[Staging_Tables_sp]
    @TableName = 'Table',
    @SchemaName = 'Schema'

当我尝试执行它时,出现以下错误:

第 10 行、第 22 列处的解析错误:')' 附近的语法不正确。

sql azure stored-procedures azure-synapse

评论


答:

0赞 agamil 11/12/2023 #1

在 T-SQL 中,若要在字符串中包含单引号字符,需要通过加倍来对其进行转义,在行的开头执行此操作,但在末尾会丢失

因此,您可以修改此行

LOCATION = N''/Folder/ParquetFiles/' + @TableName + '/'',

有了这个

LOCATION = N''/Folder/ParquetFiles/' + @TableName + '/''',

评论

0赞 Rchee 11/13/2023
我以前试过,但继续遇到同样的错误。我猜转义字符串是问题所在,但它仍在继续发生。我尝试删除参数并仅传递表名并打印字符串以查看它是否看起来很奇怪,但错误仍然存在,当我打印字符串时,一切看起来都很正常。
0赞 Julia K 11/15/2023 #2

我通过添加“select”来使用视图查询 parquet 文件,从而使您的示例正常工作。

CREATE EXTERNAL TABLE [' + @SchemaName + '].[Staging_' + @TableName +']
WITH (
LOCATION = N''/results/' + @TableName + '/'',
DATA_SOURCE = [ResultsDataSource],
FILE_FORMAT = [CSV])
AS
SELECT * FROM vwContacts');

视图:

CREATE VIEW vwContacts
AS SELECT * FROM
    OPENROWSET(
        BULK 'https://[mystorage].blob.core.windows.net/[container]/contacts.parquet',
        FORMAT='PARQUET'
    ) as [contacts]
GO