#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 может возвращать более одного набора данных. Вы должны проверить :
- возможность вашего языка управлять более чем одним набором данных во время выполнения процедуры (некоторые языки этого не могут!)
- для выполнения цикла над несколькими наборами данных