1

我有一个输出这些的 SQL 脚本,给定一个表名:

  • 表中的列名
  • 这些列的数据类型
  • 该列是否NULL允许
  • 该列是否具有唯一约束。

像这样:

column | datatype | nullable | unique
--------------------------------------
       |          |          |
       |          |          |
       |          |          |

然后我将脚本的结果保存到 csv 文件中,并运行 python 脚本对结果1执行其他操作。现在,我想做的是自动化这个过程。对于数据库中的大约 2000 个表,为这 2000 个表中的每一个执行running-sql-script然后保存到 csv-file然后running-python-script循环是非常笨拙的。

有什么方法可以在 SSMS 中自动执行此操作。我正在使用 SSMS 2014。我看过这里。尽管这是相关的,但这实际上并不是我想要的。


1.我使用python脚本创建了一个实体框架使用的C#域类。

4

1 回答 1

0

您可以使用 sysobjects 游标收集表的 id 并运行 bcp 实用程序将结果导出到 CSV 表。这是我为这项工作编写的脚本。

DECLARE @TableID int

DECLARE @TableName varchar(100)

DECLARE @sql_command varchar(4000)

DECLARE @bulk_cmd varchar(4000)

DECLARE @DatabaseName varchar(100)  ='AdventureWorks2012'

DECLARE @SQLServerName varchar(100)  ='CEMUNEY\S12'

DECLARE Cursor_Line CURSOR FOR
SELECT id,name FROM sys.sysobjects where type='U'

OPEN Cursor_Line
FETCH NEXT FROM Cursor_Line INTO @TableID, @TableName


WHILE @@FETCH_STATUS = 0

BEGIN


    SET @sql_command = N'SELECT [column] = cols.name ,[datatype] = typeuser.name ,is_nullable ,is_identity FROM @DatabaseName.sys.columns cols INNER JOIN @DatabaseName.sys.systypes datatypes ON cols.user_type_id = datatypes.xusertype LEFT OUTER JOIN @DatabaseName.sys.systypes typeuser ON  datatypes.xtype = typeuser.xusertype where object_id =' + STR(@TableID)


    SET @sql_command = REPLACE(@sql_command,  '@DatabaseName', @DatabaseName)

    set @bulk_cmd = 'SQLCMD -S @SQLServerName -W -E -q  "set nocount on;' + @sql_command +  '" -s "," -o "D:\' +  @TableName + '.csv"'

    SET @bulk_cmd = REPLACE(@bulk_cmd,  '@SQLServerName', @SQLServerName)


    exec xp_cmdshell @bulk_cmd

FETCH NEXT FROM Cursor_Line INTO @TableID, @TableName


END

CLOSE Cursor_Line
DEALLOCATE Cursor_Line
于 2016-12-08T14:24:25.910 回答