Как мне программно сгенерировать DDL таблицы в SQLServer?

#python #sql-server

#python #sql-server

Вопрос:

Я пытаюсь сгенерировать DDL таблицы в SQL Server с помощью Python. Я попытался запустить оператор: show create table schema.table который не сработал. Итак, я обратился за некоторой помощью в Интернете и выяснил, что мы можем запустить proc: sp_help as exec sp_help schema.tablename . Одна из причин, по которой я пытаюсь сгенерировать DDL, — это получить DDL и создать их в моей целевой базе данных (она находится в snowflake, и я также пишу код для создания таблиц), получить ПЕРВИЧНЫЕ и УНИКАЛЬНЫЕ КЛЮЧИ из таблицы и использовать их в своем коде (некоторые требования).

Когда я запускаю команду show create table, как показано ниже, я получаю синтаксическую ошибку, как показано ниже:

 import pyodbc 
cnxn = pyodbc.connect("Driver={SQL Server Native Client 11.0};"
                      "Server=servername;"
                      "Database=dbname;"
                      "uid=user;pwd=pwd")
cursor = cnxn.cursor()
cursor.execute('show create table dbname.tablename')
  

Ошибка:

 pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][SQL Server Native Client 11.0][SQL Server]Incorrect syntax near 'tablename'. (102) (SQLExecDirectW)")
  

Итак, я запустил sp_help в среде Sql Server management Studio, как показано ниже:

 exec sp_help 'dbo.tablename';
  

Результат:

введите описание изображения здесь

На изображении proc: sp_help возвращает много данных, а имена столбцов присутствуют во второй таблице результата, а ключевые ограничения присутствуют в последней таблице результата.

Весь этот результат находится в Sql Server Studio. Итак, я выполнил процедуру на python, как показано ниже:

 >>> import pymssql
>>> conn = pymssql.connect(host='Server\Server',user='user', password='pwd',database='dbname')
>>> cur = conn.cursor()
>>> cursor.execute("exec sp_help 'dbo.tablename'")
  

Но если я повторю результат из курсора, как показано ниже:

 >>> for r in cursor:
...     print(r)
...
  

Я вижу только первую таблицу в результате:

 ('tablename', 'dbo', 'user table', datetime.datetime(2020, 8, 27, 9, 51, 11, 213000))
  

Этот результат является первой таблицей из результата на изображении, приведенном выше.

Цикл не печатает другие детали, которые показаны на изображении, и я не понимаю, как я могу правильно реализовать цикл для печати / доступа к другим данным, которые были показаны на изображении выше. Могу ли я в любом случае получить DDL с SQL Server на Python? Любая помощь приветствуется.

Комментарии:

1. курсор считывает только строку в наборе данных. Перед наведением курсора вам необходимо выполнить цикл по нескольким наборам данных компонента.

Ответ №1:

Фактически процедура в SQL Sever может возвращать более одного набора данных. Вы должны проверить :

  1. возможность вашего языка управлять более чем одним набором данных во время выполнения процедуры (некоторые языки этого не могут!)
  2. для выполнения цикла над несколькими наборами данных