摘要:產生SQL描述欄位從 A DB 轉出到 B DB..
SQL 2000 適用 , 2000 以上沒試過.
 /*要分步驟看清楚再執行*/
/*要分步驟看清楚再執行*/ /*在 tempdb 產生一個 table 準備放產生描述的 SQL */
/*在 tempdb 產生一個 table 準備放產生描述的 SQL */ use tempdb
    use tempdb GO
    GO CREATE TABLE [DDSQL] (
    CREATE TABLE [DDSQL] ( [sid] [int] IDENTITY (1, 1) NOT NULL ,
  [sid] [int] IDENTITY (1, 1) NOT NULL , [runsql] [nvarchar] (1000) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL CONSTRAINT [DF_DDSQL_runsql] DEFAULT (0),
  [runsql] [nvarchar] (1000) COLLATE Chinese_Taiwan_Stroke_CI_AS NOT NULL CONSTRAINT [DF_DDSQL_runsql] DEFAULT (0), [isrun] [bit] NOT NULL CONSTRAINT [DF_DDSQL_isrun] DEFAULT (0),
  [isrun] [bit] NOT NULL CONSTRAINT [DF_DDSQL_isrun] DEFAULT (0), CONSTRAINT [PK_DDSQL] PRIMARY KEY  CLUSTERED
  CONSTRAINT [PK_DDSQL] PRIMARY KEY  CLUSTERED  (
  ( [sid]
      [sid] ) WITH  FILLFACTOR = 75  ON [PRIMARY]
  ) WITH  FILLFACTOR = 75  ON [PRIMARY]  ) ON [PRIMARY]
    ) ON [PRIMARY] GO
    GO 
     
     
     /*進行描述的差異比對 ,  產生描述生成的 SQL type 4 是欄位的描述 , type 3 是 table 的描述 */
/*進行描述的差異比對 ,  產生描述生成的 SQL type 4 是欄位的描述 , type 3 是 table 的描述 */ truncate table tempdb..DDSQL;
    truncate table tempdb..DDSQL; insert into tempdb..DDSQL ( runsql )
    insert into tempdb..DDSQL ( runsql ) select
    select case
  case  when B.type = '4' then
      when B.type = '4' then 'sp_addextendedproperty N''' + convert(nvarchar(255),B.name) + ''', N''' + isnull(replace(convert(nvarchar(255),B.value),'''',''''''),'')+ ''', N''user'', N''dbo'', N''table'', N''' + A.Table_name + ''', N''column'', N''' + A.Column_name + ''';'
    'sp_addextendedproperty N''' + convert(nvarchar(255),B.name) + ''', N''' + isnull(replace(convert(nvarchar(255),B.value),'''',''''''),'')+ ''', N''user'', N''dbo'', N''table'', N''' + A.Table_name + ''', N''column'', N''' + A.Column_name + ''';' when B.type = '3' then
      when B.type = '3' then 'sp_addextendedproperty N''' + convert(nvarchar(255),B.name) + ''', N''' + isnull(replace(convert(nvarchar(255),B.value),'''',''''''),'')+ ''', N''user'', N''dbo'', N''table'', N''' + A.Table_name + ''';'
    'sp_addextendedproperty N''' + convert(nvarchar(255),B.name) + ''', N''' + isnull(replace(convert(nvarchar(255),B.value),'''',''''''),'')+ ''', N''user'', N''dbo'', N''table'', N''' + A.Table_name + ''';'  end [runsql]
  end [runsql] from (
    from ( select dt.name  [Table_name] , '' [Column_name] , P.type , P.name , P.value
      select dt.name  [Table_name] , '' [Column_name] , P.type , P.name , P.value from TESTDB.dbo.SysObjects dt
      from TESTDB.dbo.SysObjects dt left join SysProperties P on
      left join SysProperties P on dt.id = P.id and  dt.xtype = 'U' and P.smallid = 0
    dt.id = P.id and  dt.xtype = 'U' and P.smallid = 0  union all
      union all Select
      Select  dt.name [Table_name], C.name [Column_name]  ,
    dt.name [Table_name], C.name [Column_name]  , P.type , P.name , P.value
    P.type , P.name , P.value From  ( Select id , name FROM SysObjects WHERE xtype = 'U' ) dt
      From  ( Select id , name FROM SysObjects WHERE xtype = 'U' ) dt  Join SysColumns C On C.id=dt.id
      Join SysColumns C On C.id=dt.id  left Join SysProperties P On C.id=P.id and C.colid=P.smallid
      left Join SysProperties P On C.id=P.id and C.colid=P.smallid  ) A left join (
    ) A left join ( select dt.name  [Table_name] , '' [Column_name] , P.type , P.name , P.value
      select dt.name  [Table_name] , '' [Column_name] , P.type , P.name , P.value from [DEMOSQL].TESTDB.dbo.SysObjects dt
      from [DEMOSQL].TESTDB.dbo.SysObjects dt join [DEMOSQL].TESTDB.dbo.SysProperties P on
      join [DEMOSQL].TESTDB.dbo.SysProperties P on dt.id = P.id and  dt.xtype = 'U' and P.smallid = 0
    dt.id = P.id and  dt.xtype = 'U' and P.smallid = 0  union all
      union all Select
      Select  dt.name [Table_name], C.name [Column_name]  ,
    dt.name [Table_name], C.name [Column_name]  , P.type , P.name , P.value
    P.type , P.name , P.value From  ( Select id , name FROM  [DEMOSQL].TESTDB.dbo.SysObjects WHERE xtype = 'U' ) dt
      From  ( Select id , name FROM  [DEMOSQL].TESTDB.dbo.SysObjects WHERE xtype = 'U' ) dt  Join [DEMOSQL].TESTDB.dbo.SysColumns C On C.id=dt.id
      Join [DEMOSQL].TESTDB.dbo.SysColumns C On C.id=dt.id  Join [DEMOSQL].TESTDB.dbo.SysProperties P On C.id=P.id and C.colid=P.smallid
      Join [DEMOSQL].TESTDB.dbo.SysProperties P On C.id=P.id and C.colid=P.smallid  ) B on
    ) B on  A.Table_name = B.Table_name and
  A.Table_name = B.Table_name and A.Column_name = B.Column_name
  A.Column_name = B.Column_name  where
    where A.name is null and B.type in ( 3 , 4 )
  A.name is null and B.type in ( 3 , 4 ) go
    go
 
     /*用 CURSOR 去 DDSQL 抓 sql 出來執行*/
/*用 CURSOR 去 DDSQL 抓 sql 出來執行*/ declare @RunSql nvarchar(1000);
    declare @RunSql nvarchar(1000); declare @sid int;
    declare @sid int; declare @I int;
    declare @I int;
DECLARE TableName CURSOR
 FOR
    FOR  select sid , runsql  from tempdb..DDSQL where isrun = 0 order by sid
  select sid , runsql  from tempdb..DDSQL where isrun = 0 order by sid 
OPEN TableName

FETCH NEXT FROM TableName INTO @sid , @RunSql
 WHILE @@FETCH_STATUS = 0
    WHILE @@FETCH_STATUS = 0 BEGIN
    BEGIN print '/*'+convert(nvarchar(100),@sid) + '*/'+ @RunSql;
  print '/*'+convert(nvarchar(100),@sid) + '*/'+ @RunSql; exec(@RunSql);
  exec(@RunSql); update  tempdb..DDSQL set isrun = 1 where sid = @sid
  update  tempdb..DDSQL set isrun = 1 where sid = @sid FETCH NEXT FROM TableName INTO @sid , @RunSql
  FETCH NEXT FROM TableName INTO @sid , @RunSql END
    END 
CLOSE TableName
 DEALLOCATE TableName
    DEALLOCATE TableName    
 
     
     /*清空現有DB所有描述 , 看情狀執行*/
/*清空現有DB所有描述 , 看情狀執行*/ sp_configure 'allow updates','1'
    sp_configure 'allow updates','1'    go
    go    reconfigure with override
    reconfigure with override   go
    go   
delete SysProperties

sp_configure 'allow updates','0'
 go
    go    reconfigure with override
    reconfigure with override go
    go   