是否有源或库可以帮助我动态生成DDL?
我需要将几百个远程数据库复制到本地服务器。该字段中的升级过程是创建一个新数据库。在本地,我也这样做。
因此,我不想为字段中的所有不同数据库版本生成DDL,而是希望从源表中读取DDL并在本地创建相同的表。
是否有这样的库或来源?
答案 0 :(得分:3)
实际上,你会发现你自己可以做到这一点,你将在这个过程中学到一些东西。我在我维护的几个数据库上使用它。我创建了一个视图,可以很容易地看到使用DDL样式信息。
create view vw_help as
select
Table_Name as TableName
, Column_Name as ColName
, Ordinal_Position as ColNum
, Data_Type as DataType
, Character_Maximum_Length as MaxChars
, coalesce(Datetime_Precision, Numeric_Precision) as [Precision]
, Numeric_Scale as Scale
, Is_Nullable as Nullable
, case when (Data_Type in ('varchar', 'nvarchar', 'char', 'nchar', 'binary', 'varbinary')) then
case when (Character_Maximum_Length = -1) then Data_Type + '(max)'
else Data_Type + '(' + convert(varchar(6),Character_Maximum_Length) + ')'
end
when (Data_Type in ('decimal', 'numeric')) then
Data_Type + '(' + convert(varchar(4), Numeric_Precision) + ',' + convert(varchar(4), Numeric_Scale) + ')'
when (Data_Type in ('bit', 'money', 'smallmoney', 'int', 'smallint', 'tinyint', 'bigint', 'date', 'time', 'datetime', 'smalldatetime', 'datetime2', 'datetimeoffset', 'datetime2', 'float', 'real', 'text', 'ntext', 'image', 'timestamp', 'uniqueidentifier', 'xml')) then Data_Type
else 'unknown type'
end as DeclA
, case when (Is_Nullable = 'YES') then 'null' else 'not null' end as DeclB
, Collation_Name as Coll
-- ,*
from Information_Schema.Columns
GO
我使用以下内容“显示表结构”
/*
exec ad_Help TableName, 1
*/
ALTER proc [dbo].[ad_Help] (@TableName nvarchar(128), @ByOrdinal int = 0) as
begin
set nocount on
declare @result table
(
TableName nvarchar(128)
, ColName nvarchar(128)
, ColNum int
, DataType nvarchar(128)
, MaxChars int
, [Precision] int
, Scale int
, Nullable varchar(3)
, DeclA varchar(max)
, DeclB varchar(max)
, Coll varchar(128)
)
insert @result
select TableName, ColName, ColNum, DataType, MaxChars, [Precision], Scale, Nullable, DeclA, DeclB, Coll
from dbo.vw_help
where TableName like @TableName
if (select count(*) from @result) <= 0
begin
select 'No tables matching ''' + @TableName + '''' as Error
return
end
if (@ByOrdinal > 0)
begin
select * from @result order by TableName, ColNum
end else begin
select * from @result order by TableName, ColName
end
end
GO
如果你还需要生成外键等,你可以使用InformationSchemas中的其他信息。它有点复杂,我从不打扰充实生成DDL所需的一切,但你应该得到正确的想法。当然,如果您可以使用已经建议的内容,我也不会打扰自己。
添加评论 - 我没有给你一个确切的答案,但很乐意提供帮助。您需要生成大量动态字符串操作才能使其正常工作 - varchar(max)有所帮助。我将指出TSQL不是这类项目的首选语言。就个人而言,如果我必须生成完整的表DDL,我可能会想把它写成CLR proc并在C#中执行繁重的字符串操作。如果这对你有意义,我仍然会调试SQL服务器之外的进程(例如用于测试和dinking的表单项目)。请记住,CLR procs是Net 2.0框架。
您绝对可以创建一个返回一组结果的存储过程,即表列为1,外键为1等,然后在C#中使用该组结果并构建DDL语句。在C#代码中。
答案 1 :(得分:2)
建议审核SQL Server Management Objects (SMO)或Red Gate的一些工具。
答案 2 :(得分:2)
Gary Walker,基于你的脚本,我创造了我所需要的。非常感谢你的帮助。
在这里,如果有其他人需要它:
with ColumnDef (TableName, ColName, ColNum, DeclA, DeclB)
as
(
select
Table_Name as TableName
, Column_Name as ColName
, Ordinal_Position as ColNum
, case when (Data_Type in ('varchar', 'nvarchar', 'char', 'nchar', 'binary', 'varbinary')) then
case when (Character_Maximum_Length = -1) then Data_Type + '(max)'
else Data_Type + '(' + convert(varchar(6),Character_Maximum_Length) + ')'
end
when (Data_Type in ('decimal', 'numeric')) then
Data_Type + '(' + convert(varchar(4), Numeric_Precision) + ',' + convert(varchar(4), Numeric_Scale) + ')'
when (Data_Type in ('bit', 'money', 'smallmoney', 'int', 'smallint', 'tinyint', 'bigint', 'date', 'time', 'datetime', 'smalldatetime', 'datetime2', 'datetimeoffset', 'datetime2', 'float', 'real', 'text', 'ntext', 'image', 'timestamp', 'uniqueidentifier', 'xml')) then Data_Type
else 'unknown type'
end as DeclA
, case when (Is_Nullable = 'YES') then 'null' else 'not null' end as DeclB
from Information_Schema.Columns
)
select 'CREATE TABLE ' + TableName + ' (' +
substring((select ', ' + ColName + ' ' + declA + ' ' + declB
from ColumnDef
where tablename = t.TableName
order by ColNum
for xml path ('')),2,8000) + ') '
from
(select distinct TableName from ColumnDef) t