摘要:產生SQL描述欄位從 A DB 轉出到 B DB..
SQL 2000 適用 , 2000 以上沒試過.
/*要分步驟看清楚再執行*/
/*在 tempdb 產生一個 table 準備放產生描述的 SQL */
use tempdb
GO
CREATE TABLE [DDSQL] (
[sid] [int] IDENTITY (1, 1) NOT NULL ,
[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),
CONSTRAINT [PK_DDSQL] PRIMARY KEY CLUSTERED
(
[sid]
) WITH FILLFACTOR = 75 ON [PRIMARY]
) ON [PRIMARY]
GO
/*進行描述的差異比對 , 產生描述生成的 SQL type 4 是欄位的描述 , type 3 是 table 的描述 */
truncate table tempdb..DDSQL;
insert into tempdb..DDSQL ( runsql )
select
case
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 + ''';'
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 + ''';'
end [runsql]
from (
select dt.name [Table_name] , '' [Column_name] , P.type , P.name , P.value
from TESTDB.dbo.SysObjects dt
left join SysProperties P on
dt.id = P.id and dt.xtype = 'U' and P.smallid = 0
union all
Select
dt.name [Table_name], C.name [Column_name] ,
P.type , P.name , P.value
From ( Select id , name FROM SysObjects WHERE xtype = 'U' ) dt
Join SysColumns C On C.id=dt.id
left Join SysProperties P On C.id=P.id and C.colid=P.smallid
) A left join (
select dt.name [Table_name] , '' [Column_name] , P.type , P.name , P.value
from [DEMOSQL].TESTDB.dbo.SysObjects dt
join [DEMOSQL].TESTDB.dbo.SysProperties P on
dt.id = P.id and dt.xtype = 'U' and P.smallid = 0
union all
Select
dt.name [Table_name], C.name [Column_name] ,
P.type , P.name , P.value
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.SysProperties P On C.id=P.id and C.colid=P.smallid
) B on
A.Table_name = B.Table_name and
A.Column_name = B.Column_name
where
A.name is null and B.type in ( 3 , 4 )
go
/*用 CURSOR 去 DDSQL 抓 sql 出來執行*/
declare @RunSql nvarchar(1000);
declare @sid int;
declare @I int;
DECLARE TableName CURSOR
FOR
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
BEGIN
print '/*'+convert(nvarchar(100),@sid) + '*/'+ @RunSql;
exec(@RunSql);
update tempdb..DDSQL set isrun = 1 where sid = @sid
FETCH NEXT FROM TableName INTO @sid , @RunSql
END
CLOSE TableName
DEALLOCATE TableName
/*清空現有DB所有描述 , 看情狀執行*/
sp_configure 'allow updates','1'
go
reconfigure with override
go
delete SysProperties
sp_configure 'allow updates','0'
go
reconfigure with override
go
/*在 tempdb 產生一個 table 準備放產生描述的 SQL */
use tempdb
GO
CREATE TABLE [DDSQL] (
[sid] [int] IDENTITY (1, 1) NOT NULL ,
[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),
CONSTRAINT [PK_DDSQL] PRIMARY KEY CLUSTERED
(
[sid]
) WITH FILLFACTOR = 75 ON [PRIMARY]
) ON [PRIMARY]
GO
/*進行描述的差異比對 , 產生描述生成的 SQL type 4 是欄位的描述 , type 3 是 table 的描述 */
truncate table tempdb..DDSQL;
insert into tempdb..DDSQL ( runsql )
select
case
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 + ''';'
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 + ''';'
end [runsql]
from (
select dt.name [Table_name] , '' [Column_name] , P.type , P.name , P.value
from TESTDB.dbo.SysObjects dt
left join SysProperties P on
dt.id = P.id and dt.xtype = 'U' and P.smallid = 0
union all
Select
dt.name [Table_name], C.name [Column_name] ,
P.type , P.name , P.value
From ( Select id , name FROM SysObjects WHERE xtype = 'U' ) dt
Join SysColumns C On C.id=dt.id
left Join SysProperties P On C.id=P.id and C.colid=P.smallid
) A left join (
select dt.name [Table_name] , '' [Column_name] , P.type , P.name , P.value
from [DEMOSQL].TESTDB.dbo.SysObjects dt
join [DEMOSQL].TESTDB.dbo.SysProperties P on
dt.id = P.id and dt.xtype = 'U' and P.smallid = 0
union all
Select
dt.name [Table_name], C.name [Column_name] ,
P.type , P.name , P.value
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.SysProperties P On C.id=P.id and C.colid=P.smallid
) B on
A.Table_name = B.Table_name and
A.Column_name = B.Column_name
where
A.name is null and B.type in ( 3 , 4 )
go
/*用 CURSOR 去 DDSQL 抓 sql 出來執行*/
declare @RunSql nvarchar(1000);
declare @sid int;
declare @I int;
DECLARE TableName CURSOR
FOR
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
BEGIN
print '/*'+convert(nvarchar(100),@sid) + '*/'+ @RunSql;
exec(@RunSql);
update tempdb..DDSQL set isrun = 1 where sid = @sid
FETCH NEXT FROM TableName INTO @sid , @RunSql
END
CLOSE TableName
DEALLOCATE TableName
/*清空現有DB所有描述 , 看情狀執行*/
sp_configure 'allow updates','1'
go
reconfigure with override
go
delete SysProperties
sp_configure 'allow updates','0'
go
reconfigure with override
go