Sql SSIS:以编程方式生成创建表DDL

Sql SSIS:以编程方式生成创建表DDL,sql,sql-server,tsql,ssis,Sql,Sql Server,Tsql,Ssis,有没有可以帮助我动态生成DDL的源代码或库 我有几百个远程数据库需要复制到本地服务器。字段中的升级过程是创建新数据库。在当地,我也这样做 因此,我希望从源表中读取DDL,并在本地创建一个相同的表,而不是为字段中的所有不同DB版本生成DDL 有这样的库或源吗?建议您复习一下,或者阅读一些RedGate的工具。事实上,您会发现自己可以做到这一点,并在这个过程中学到一些东西。我在我维护的几个数据库上使用它。我创建了一个视图,使用DDL样式信息可以轻松查看 create view vw_help as

有没有可以帮助我动态生成DDL的源代码或库

我有几百个远程数据库需要复制到本地服务器。字段中的升级过程是创建新数据库。在当地,我也这样做

因此,我希望从源表中读取DDL,并在本地创建一个相同的表,而不是为字段中的所有不同DB版本生成DDL


有这样的库或源吗?

建议您复习一下,或者阅读一些RedGate的工具。

事实上,您会发现自己可以做到这一点,并在这个过程中学到一些东西。我在我维护的几个数据库上使用它。我创建了一个视图,使用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
如果还需要生成外键等,您可以在InformationSchema中使用其他信息。这有点复杂,我从来没有费心去充实生成DDL所需的一切,但您应该有正确的想法。当然,如果你能使用已经提出的建议,我就不会麻烦你自己滚动了

补充评论-我没有给你一个确切的答案,但很高兴能帮助你。您将需要生成大量的动态字符串操作来实现这一点-varcharmax有帮助。我将指出TSQL不是此类项目的首选语言。就个人而言,如果我必须生成完整的表DDL,我可能会尝试将其作为CLR过程编写,并用C进行繁重的字符串操作。如果这对您有意义,我仍然会在SQL server之外调试该过程,例如,用于测试和调试的表单项目。请记住,CLR进程是NET2.0框架


您完全可以创建一个存储过程,返回一组结果,即1个用于表列,1个用于外键,等等。然后在C中使用该组结果并生成DDL语句。在C代码中。

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

谢谢,这是我一直在寻找的。+1为张贴您自己的完整答案-似乎很少有人打扰。您的最终选择可能是从信息模式中选择表名称。表tBTW我使用视图有两个原因-我从多个地方使用它,我发现它在大多数情况下都比基于SQL的视图快。