Создать базу данных, если она уже существует, с использованием QUOTENAME - PullRequest
0 голосов
/ 17 марта 2019
conn = pyodbc.connect("DRIVER={SQL Server};"
    "SERVER="+server+";"
    "UID="+username+";"
    "PWD="+password,
    autocommit=True)

cursor = conn.cursor()

database= "abcd"
sql_create = (
        "DECLARE @sql AS NVARCHAR(MAX);"
        "SET @sql = 'if not exists(select * from sys.databases where name = ' + QUOTENAME(?) + ')'  + ' CREATE DATABASE ' + QUOTENAME(?);"
        "EXEC sp_executesql @sql")
cursor.execute(sql_create,database,database)  

Получение сообщения об ошибке типа pyodbc.ProgrammingError: ('42S22', u "[42S22] [Microsoft] [Драйвер ODBC 17 для SQL Server] [SQL Server] Неверное имя столбца 'abcd'. (207) (SQLExecDirectW) ")"

1 Ответ

0 голосов
/ 17 марта 2019

Не используйте QUOTENAME и конкатенацию для параметра предложения WHERE. Кроме того, избегайте использования устаревшего драйвера SQL Server ODBC, поставляемого с Windows, для доступа к базе данных SQL Azure. Вместо этого загрузите и используйте более новый драйвер ODBC . Ниже приведен пример с этими изменениями.

conn = pyodbc.connect("DRIVER={ODBC Driver 17 for SQL Server};"
    "SERVER="+server+";"
    "UID="+username+";"
    "PWD="+password,
    autocommit=True)

cursor = conn.cursor()

database= "abcd"
sql_create = (
        "DECLARE @sql AS NVARCHAR(MAX);"
        "SET @sql = N'if not exists(select * from sys.databases where name = @DatabaseName)'  + N' CREATE DATABASE ' + QUOTENAME(?) + N';';"
        "EXEC sp_executesql @sql, N'@DatabaseName sysname', @DatabaseName = ?;")
cursor.execute(sql_create,database,database)  

Вы также можете объявить переменную T-SQL для имени базы данных и присвоить ее значению параметра, чтобы вам нужно было передать только один параметр:

sql_create = (
        "DECLARE @sql AS NVARCHAR(MAX);"
        "DECLARE @DatabaseName sysname = ?;"
        "SET @sql = N'if not exists(select * from sys.databases where name = @DatabaseName)'  + N' CREATE DATABASE ' + QUOTENAME(@DatabaseName) + N';';"
        "EXEC sp_executesql @sql, N'@DatabaseName sysname', @DatabaseName = @DatabaseName;")
cursor.execute(sql_create,database)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...