【问题标题】:Code for Iteratively Adding New Columns in SQL Server Table在 SQL Server 表中迭代添加新列的代码
【发布时间】:2022-01-17 08:24:08
【问题描述】:

我有一个列列表要添加到 SQL Server 数据库中。

colList = ['title', 'docDate', 'coleadAgency',
           'usBusinessName', 'description',
           'acquCountry', 'ubo1Value', 'naicsCode',
           'mitigation']

我有一个名为 TAbby 的表,并希望将这些列添加到其中。我试过了

for col in colList:
    cur.execute(""" ALTER TABLE TAbby ADD (?) NVARCHAR(255) """, col)
    cur.commit()

但我得到了错误:

ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]'(' 附近的语法不正确。(102) (SQLExecDirectW); [42000] [Microsoft][ ODBC Driver 17 for SQL Server][SQL Server]无法准备语句。(8180)")

【问题讨论】:

  • 你不能参数化 DDL 语句。
  • 谢谢@DaleK 这是否意味着我别无选择,只能手动添加所有列?
  • 不,这意味着如果你想这样做,你需要使用字符串连接而不是参数 - 我想无论如何,我不知道 python,但我假设 ?在幕后使用参数。如果您自己构建字符串,请尝试,例如"ALTER TABLE TAbby ADD " + col + " NVARCHAR(255)"。这样做的问题是它不安全,因为您对 SQL 注入持开放态度。

标签: python sql-server tsql


【解决方案1】:

您不能参数化标识符,例如表名或列名。参数是为文字值保留的。因此,动态字符串格式化 SQL 语句中的列名。 (列名周围的方括号用于转义特殊字符、空格或保留字)。

for col in colList: 
    cur.execute(f"ALTER TABLE TAbby ADD [{col}] NVARCHAR(255)") 
    cur.commit()

实际上,TSQL 在ADD 子句中支持多个逗号分隔的列。因此,请考虑使用列表理解进行构建:

new_cols = ", ".join([f"[{col}] NVARCHAR(255)" for col in colList])

cur.execute(f"ALTER TABLE TAbby ADD [{new_cols}]") 
cur.commit()

【讨论】:

    猜你喜欢
    • 2020-08-09
    • 2015-05-14
    • 2018-02-22
    • 2015-09-06
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多