【问题标题】:Syntax error when using input parameter to create procedure使用输入参数创建过程时出现语法错误
【发布时间】:2021-04-26 06:08:59
【问题描述】:

我收到了这个错误

消息 103010,第 16 级,状态 1,第 1 行
解析错误在第 33 行,第 15 列:'@sas_token' 附近的语法不正确

以下是我正在关注的指南供参考:

https://docs.microsoft.com/en-us/azure/synapse-analytics/sql-data-warehouse/quickstart-bulk-load-copy-tsql-examples#b-shared-access-signatures-sas-with-crlf-as-the-row-terminator-windows-style-new-line

https://docs.microsoft.com/en-us/azure/synapse-analytics/sql/develop-stored-procedures#stored-procedures-in-synapse-sql

我尝试了注释部分,因为我认为它无法识别引号,但它仍然不起作用

CREATE PROCEDURE dbo.bulk_load 
    @sas_token VARCHAR(500)
AS
BEGIN
    --DECLARE @sas varchar(500)
    --SET @sas = ''''+ @sas_token + ''''
    IF OBJECT_ID('dbo.ITEM_INFORMATION') IS NOT NULL
        DROP TABLE dbo.ITEM_INFORMATION;

    CREATE TABLE dbo.ITEM_INFORMATION 
    (
        model VARCHAR(20),
        col1 VARCHAR(15),
        col2 VARCHAR(3),
        col3 VARCHAR(255)
    );

    COPY INTO dbo.ITEM_INFORMATION
    FROM 'https://server.blob.core.windows.net/container/subfolder/file.csv' 
         WITH (FILE_TYPE = 'CSV',
               FIRSTROW = 2,
               CREDENTIAL = (
                             IDENTITY = 'Shared Access Signature',
                             SECRET = @sas_token --@sas also tried '''' + @sas_token + ''''
                            )
            );
END

这个过程将像这样从 Python 中调用:

def update_database(sas_token):

    #Runs the stored procedure to load the data from Azure storage to table.
    #Uses the password stored in user environment variable.
    
    server = 'server.database.windows.net'
    database = 'database'
    username = 'username'
    if 'server_password' not in os.environ:
        print("Missing environment variable 'server_password' containing database password.")
    password = os.getenv('server_password') 
    driver= '{ODBC Driver 17 for SQL Server}'
    sql = f'EXEC dbo.bulk_load, {sas_token};'
    connection = pyodbc.connect('DRIVER='+driver+';SERVER='+server+';PORT=1433;DATABASE='+database+';UID='+username+';PWD='+ password)
    connection.autocommit = True
    connection.execute(sql)
    connection.close()

【问题讨论】:

  • 你如何调用这个过程?
  • 你应该去掉第一行中包含 @sas_token 参数定义的括号
  • SECRET好像不能通过参数设置,必须硬编码...?
  • @rs 我将通过 python 使用 pyodbc 调用此过程。问题是程序一开始就没有创建。 SAS 令牌将每 90 天更改一次,我将它存储在环境变量中,然后从 python 中读取它,然后传递给该过程并调用。
  • 你能粘贴你看到的完整错误,包括行号和所有内容吗?

标签: sql tsql azure-synapse


【解决方案1】:

这应该有效。我已经动态创建了 Copy 命令并将 SAS 令牌传递给它。一旦我创建了复制命令,我就会执行命令。打印语句,我用它作为测试。 高温

CREATE PROCEDURE dbo.bulk_load 
    @sas_token VARCHAR(500)
AS
BEGIN
    --DECLARE @sas varchar(500)
    --SET @sas = ''''+ @sas_token + ''''
    declare @query varchar(max) 
    IF OBJECT_ID('dbo.ITEM_INFORMATION') IS NOT NULL
        DROP TABLE dbo.ITEM_INFORMATION;

    CREATE TABLE dbo.ITEM_INFORMATION 
    (
        SSN VARCHAR(20),
        Name VARCHAR(15)
    );

    SELECT @query  ='
    COPY INTO dbo.ITEM_INFORMATION
    FROM ''https://server.blob.core.windows.net/container/subfolder/file.csv''
         WITH (FILE_TYPE = ''CSV'',
               FIELDTERMINATOR = ''',''',
               FIRSTROW = 2,
               ROWTERMINATOR = ''\n'',
               CREDENTIAL = (
                             IDENTITY = ''Shared Access Signature'',
                             SECRET =  '''+@sas_token+'''
                             )
            );'
            print @query
            exec(@query)
END

【讨论】:

  • 谢谢你这对我有用。动态查询正是我想要的
猜你喜欢
  • 2013-05-12
  • 2018-11-21
  • 2018-08-11
  • 1970-01-01
  • 2016-08-20
  • 2019-09-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多