gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 07:13:09 37 4
gpt4 key购买 nike

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

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

DBArtisan 产生了我正在寻找的准确结果,但我有一个包含几十个我需要处理的表的动态列表,并且希望有一个程序化的解决方案。

我认为 DBArtisan 必须以某种方式调用 API。他们只是在破坏 systables 还是安装了我缺少的系统存储过程(类似于生成存储过程文本的系统)?

最佳答案

最好的解决方案是将它包装到一个很好的存储过程中,但您应该从下面的代码中得到这个想法。只需替换:

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

关于sql - 如何通过 SQL 提取 Sybase (12.5) 表 DDL?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3720851/

37 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com