首页 > 解决方案 > 如何在 SqlServer 中以编程方式生成表的 DDL?

问题描述

我正在尝试使用 Python 在 SQL Server 中生成表的 DDL。我试图运行语句:show create table schema.table这不起作用。所以我在网上寻求一些帮助,发现我们可以运行 proc: sp_helpas exec sp_help schema.tablename。我尝试生成 DDL 的原因之一是获取 DDL 并在我的目标数据库中创建它们(它在雪花中,我也在编写代码来创建表)从表中获取 PRIMARY 和 UNIQUE KEYS并在我的代码中使用它们(一些要求)。

当我如下运行 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)")

所以我在 Sql Server 管理工作室中运行 sp_help 如下:

exec sp_help 'dbo.tablename';

结果:

在此处输入图像描述

在图像中,proc: sp_help 返回大量数据,列名出现在结果的第二个表中,键约束出现在结果的最后一个表中。

所有这些结果都可以在 Sql Server Studio 中找到。所以我在python中运行proc如下:

>>> 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))

此结果是上图中结果的第一个表。

该循环不打印图像中显示的其他详细信息,我不明白如何正确实现循环以打印/访问上图中显示的其他数据。无论如何我可以从 Python 中的 SQL Server 获取 DDL 吗?任何帮助表示赞赏。

标签: pythonsql-server

解决方案


事实上,SQL Sever 中的一个过程可以返回多个数据集。你必须检查:

  1. 您的语言在执行过程时管理多个数据集的能力(某些语言无法做到!)
  2. 对多个数据集进行循环

推荐阅读