Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何通过SQL提取Sybase(12.5)表DDL?_Sql_Sybase_Ddl - Fatal编程技术网

如何通过SQL提取Sybase(12.5)表DDL?

如何通过SQL提取Sybase(12.5)表DDL?,sql,sybase,ddl,Sql,Sybase,Ddl,我浏览过类似的问题,但它们似乎是指其他数据库和/或外部语言 我希望通过SQL以编程方式提取表DDL,结果“足够好”,可以重新导入和重构表 DBArtisan产生了我想要的确切结果,但我有一个包含几十个表的动态列表,我需要处理这些表,并希望得到一个编程解决方案 我认为DBArtisan必须以某种方式调用API。他们只是在攻击SYSTABLE,还是有一个系统安装的存储过程(类似于生成存储过程文本的过程)我没有 IIRC有一个叫做DBSchema的工具(peppler.org/downloads/DB

我浏览过类似的问题,但它们似乎是指其他数据库和/或外部语言

我希望通过SQL以编程方式提取表DDL,结果“足够好”,可以重新导入和重构表

DBArtisan产生了我想要的确切结果,但我有一个包含几十个表的动态列表,我需要处理这些表,并希望得到一个编程解决方案


我认为DBArtisan必须以某种方式调用API。他们只是在攻击SYSTABLE,还是有一个系统安装的存储过程(类似于生成存储过程文本的过程)我没有

IIRC有一个叫做DBSchema的工具(peppler.org/downloads/DBSchema-2_4_2.zip是我能找到的最好的URL)-如果URL不响,Mike peppler是sybperl的作者。如果您喜欢自己的脚本,您可以对该脚本的代码进行反向工程

就SQL而言,表信息在Sybase的
sysobjects
表中,列信息在Sybase的
syscolumns


您还可以使用存储过程:

是的,但不仅仅是表名和列。 您需要约束、索引、键、默认值、分区、权限。。。。。。 值得注意的是,sybase代码的底层资源是如此之少
(sp_帮助并没有涵盖所有内容-要进行测试,请使用类似DBArtisan Extract DDL tool的工具,您将看到这是多么全面!)

最好的解决方案是将其包装到一个漂亮的存储过程中,但您应该从下面的代码中了解这一点。只需替换:

   SELECT @OnlyTableName = 'my_table_name'
使用表名并执行代码,您应该在代码末尾获得#rtn表中的所有DDL语句:

   DECLARE @TableName               varchar(50)
   DECLARE @ObjectID                int
   DECLARE @IndexID                 int
   DECLARE @IndexStatus             int
   DECLARE @IndexName               varchar(30)
   DECLARE @msg                     varchar(255)
   DECLARE @OnlyTableName           varchar(50)
   DECLARE @LastColumnId            int
   DECLARE @i                       int


   SELECT @OnlyTableName = 'my_table_name'


   CREATE TABLE #columns (
      column_name char(30)    NULL,
      type_name   char(30)    NULL,
      length      char(10)    NULL,
      iden_flag   char(10)    NULL,
      null_flag   char(20)    NULL,
      flag        char(1)     NULL
   )

   CREATE TABLE #rtn (
      msg   varchar(255)   NULL
   )



   SELECT @TableName = name,
          @ObjectID  = id
     FROM sysobjects
    WHERE type = 'U'
      AND name = @OnlyTableName
    ORDER BY name

   SELECT @LastColumnId = MAX(colid) FROM syscolumns WHERE id = @ObjectID

   INSERT #columns
   SELECT col.name,
          typ.name,
          CASE WHEN typ.name in ('decimal','numeric') THEN '(' +
convert(varchar, col.prec) + ',' + convert(varchar, col.scale) + ')'
               WHEN typ.name like '%char%'THEN
'('+CONVERT(varchar,col.length)+')'
               ELSE '' END,
          CASE WHEN col.status = 0x80 THEN 'IDENTITY' ELSE '' END,
          CASE WHEN convert(bit, (col.status & 8)) = 0 THEN "NOT NULL"
ELSE "NULL" END + CASE WHEN col.colid = @LastColumnId THEN ')' ELSE
',' END,
          NULL
     FROM syscolumns col, systypes typ
    WHERE col.id = @ObjectID
      AND col.usertype = typ.usertype
    ORDER BY col.colid


   INSERT #rtn
   SELECT "CREATE TABLE " + @TableName + " ("
   UNION ALL
   SELECT '    '+
                    column_name + replicate(' ',30- len(column_name)) +
                    type_name + length + replicate(' ',20 -
len(type_name+length)) +
                    iden_flag + replicate(' ',10 - len(iden_flag))+
                    null_flag
        FROM #columns

   SELECT name, indid, status, 'N' as flag INTO #indexes
   FROM sysindexes WHERE id = @ObjectID

   SET ROWCOUNT 1
   WHILE 1=1
   BEGIN
      SELECT @IndexName = name, @IndexID = indid, @IndexStatus =
status FROM #indexes WHERE flag = 'N'
      IF @@ROWCOUNT = 0
         BREAK

      SELECT @i = 1
      SELECT @msg = ''
      WHILE 1=1
      BEGIN
         IF index_col(@TableName, @IndexID, @i) IS NULL
            BREAK

         SELECT @msg = @msg + index_col(@TableName, @IndexID, @i) +
CASE WHEN index_col(@TableName, @IndexID, @i+1) IS NOT NULL THEN ','
END
         SELECT @i = @i+1
      END

      IF @IndexStatus & 2048 = 2048 --PRIMARY KEY
         INSERT #rtn
         SELECT "ALTER TABLE " + @TableName +
                " ADD CONSTRAINT " + @IndexName +
                " primary key "+
                CASE WHEN @IndexID != 1 THEN 'nonclustered ' END +
'('+ @msg +')'
      ELSE
         IF (@IndexStatus & 2048 = 0 AND @IndexID NOT IN (0, 255))
--NOT PRIMARY KEY
            INSERT #rtn
            SELECT 'CREATE '+
            CASE WHEN @IndexStatus & 2 = 2 THEN 'UNIQUE ' ELSE '' END +
            CASE WHEN @IndexID = 1 THEN 'CLUSTERED ' ELSE 'NONCLUSTERED ' END +
            'INDEX ' + @IndexName + ' ON ' + @TableName + ' ('+ @msg +')'

      UPDATE #indexes SET flag = 'Y' WHERE indid = @IndexID

   END
   SET ROWCOUNT 0

   SELECT * FROM #rtn

   DROP TABLE #columns
   DROP TABLE #rtn
如果有帮助,请告诉我


(这一部分的学分归ROCKY;-)

ASE随DDL脚本生成器实用程序一起提供-

该实用程序可用于为整个数据库、表等创建脚本备份。Sybase帮助站点中提供了示例命令


在Windows下,可以在%sybase%/ASE-15_0/bin中找到该实用程序

这实际上不是一个编程问题——您需要为数据库实现找到适当的转储命令。e、 g.在mysql中,它应该是
mysqldump--add-drop-database--add-drop-table--databases
。非常好,非常感谢。是的,看来正确的解决方案要么是dbschema本身,要么就是在其中找到的。@Michael-很高兴能帮上忙。如果这是有用的,请随时投票或接受:)一个完全合理的关注,但在我的情况下,我只需要最低公分母结构。啊,非常好,我喜欢它