转贴:ALTER PROCEDURE [dbo].[pr_CreateColumnDefs] AS
declare @TableName varchar(50),
@ColumnName varchar(50),
@ColList varchar(4000),
@TypeName varchar(13),
@Precision int,
@Length int,
@Scale smallint,
@Nullable smallint,
@ColumnDef nvarchar(4000),
@IsKeyField smallint,
@KeyFields varchar(4000),
@tempString varchar(100),
@BussinessName varchar(100),
@BaseFields varchar(4000),
@MainTableName varchar(400),
@QueryName varchar(100),
@AllFields varchar(4000),
@FieldIndex integer,
@DisplayName varchar(100),
@tempTableName varchar(100),
@TableType varchar(10),
@CheckTableName varchar(50)
/* 一个临时表存放字段定义*/
create table #ColumnList(
TABLE_QUALIFIER sysname ,
TABLE_OWNER sysname ,
TABLE_NAME sysname ,
COLUMN_NAME sysname ,
DATA_TYPE smallint ,
[TYPE_NAME] varchar(13) ,
[PRECISION] int,
[LENGTH] int,
SCALE smallint,
RADIX smallint,
NULLABLE smallint,
REMARKS varchar(254) ,
COLUMN_DEF nvarchar(2000),
SQL_DATA_TYPE smallint ,
SQL_DATETIME_SUB smallint ,
CHAR_OCTET_LENGTH int,
ORDINAL_POSITION int ,
IS_NULLABLE varchar(254) ,
IsKeyField tinyint
)/*一个临时表存放主键定义*/
create table #pkeys (
DatabaseName sysname,
Owner sysname,
tableName sysname,
columnName sysname,
keyseq smallint,
pkname sysname
)/*一个临时表存放业务类定义*/
create table #BussinessDef(
[BussinessName] [varchar] (50),/*业务类名称*/
[MainTableName] [varchar] (50),/*主表名*/
[BaseFields] [varchar] (2000),/*所有字段列表*/
[KeyFields] [varchar] (2000),/*关键字段列表*/
)/*一个临时表存放查询定义*/
create table #QueryDef(
[QueryName] [varchar] (50) ,
[AllFields] [varchar] (4000)
)/*一个临时表存放字段的中文描述*/
create table #ColDescript (
TableName sysname,
ColumnName sysname,
ColumnDescript varchar(100)
)/*一个临时表存放外键定义*/
create table #ForeignKeyDefs (
[PKTABLE_QUALIFIER] [nvarchar] (128),
[PKTABLE_OWNER] [nvarchar] (128),
[PKTABLE_NAME] [nvarchar] (128),
[PKCOLUMN_NAME] [nvarchar] (128),
[FKTABLE_QUALIFIER] [nvarchar] (128),
[FKTABLE_OWNER] [nvarchar] (128),
[FKTABLE_NAME] [nvarchar] (128),
[FKCOLUMN_NAME] [varchar] (32),
[KEY_SEQ] [smallint],
[UPDATE_RULE] [smallint],
[DELETE_RULE] [smallint],
[FK_NAME] [nvarchar] (128),
[PK_NAME] [nvarchar] (128),
[DEFERABLITY] [smallint]
) /*取得数据库所有字段的描述*/
insert into #ColDescript
select distinct
sysobjects.[name] as tablename,
syscolumns.[name] as columnname ,
cast(sysproperties.value as varchar(100)) as [descript]
From
sysobjects,syscolumns ,sysproperties
where
sysobjects.id = syscolumns.id and
sysproperties.id=sysobjects.id and
sysproperties.smallid = syscolumns.colid/*选择本数据库中的所有表和视图*/
declare crTableList cursor FAST_FORWARD READ_ONLY For
select [name],[type] From [dbo].[sysobjects] where type='U' or type='V'
order by TYPEOpen crTableList/*取得一个表的名称和表的类型*/
fetch next from crTableList into @TableName,@TableTypewhile (@@FETCH_STATUS <> -1)
begin
/*取得表@TableName的主键值列表*/
insert into #pkeys exec sp_pkeys @TableName
/*取得表@TableName的列定义临时列表*/
insert into #ColumnList exec sp_columns @TableName
/*取得表@TableName的所有外键列表*/
insert into #ForeignKeyDefs exec sp_fkeys @TableName
/*取得本表各列的游标*/
declare crCols cursor FAST_FORWARD READ_ONLY for
Select COLUMN_NAME From #ColumnList
Where TABLE_NAME=@TableName Order by Ordinal_Position
Open crCols fetch next from crCols into @ColumnName Select @ColList = ''
Select @KeyFields = '' while (@@FETCH_STATUS <> -1)
begin if EXISTS(Select * from #pkeys where tablename = @TableName and ColumnName = @ColumnName )
Select @IsKeyField = 1
else
Select @IsKeyField = 0 Select @ColList = @ColList + @TableName + '.' +@ColumnName + ';' if @IsKeyField = 1
Select @KeyFields = @TableName + '.' + @ColumnName + ';' + @KeyFields Update #ColumnList Set IsKeyField = @IsKeyField where Table_Name = @TableName and
Column_Name = @ColumnName fetch next from crCols into @ColumnName end
if @TableType = 'U'
/*如果是用户表*/
begin
/*插入一条业务类定义纪录*/
insert into #BussinessDef(BussinessName,MainTableName,BaseFields,KeyFields)
values (@TableName,@TableName,@ColList,@KeyFields)
/*插入一条查询定义纪录*/
insert into #QueryDef(QueryName,AllFields)
values (@TableName,@ColList)
end
else
/*如果是视图*/
begin
/*插入一条查询定义纪录,主要用于业务填写表格界面*/
insert into #QueryDef(QueryName,AllFields)
values (@TableName,@ColList)
/* 插入另外一条查询定义纪录,后缀为Query,主要用于查询报表*/
declare @TableName varchar(50),
@ColumnName varchar(50),
@ColList varchar(4000),
@TypeName varchar(13),
@Precision int,
@Length int,
@Scale smallint,
@Nullable smallint,
@ColumnDef nvarchar(4000),
@IsKeyField smallint,
@KeyFields varchar(4000),
@tempString varchar(100),
@BussinessName varchar(100),
@BaseFields varchar(4000),
@MainTableName varchar(400),
@QueryName varchar(100),
@AllFields varchar(4000),
@FieldIndex integer,
@DisplayName varchar(100),
@tempTableName varchar(100),
@TableType varchar(10),
@CheckTableName varchar(50)
/* 一个临时表存放字段定义*/
create table #ColumnList(
TABLE_QUALIFIER sysname ,
TABLE_OWNER sysname ,
TABLE_NAME sysname ,
COLUMN_NAME sysname ,
DATA_TYPE smallint ,
[TYPE_NAME] varchar(13) ,
[PRECISION] int,
[LENGTH] int,
SCALE smallint,
RADIX smallint,
NULLABLE smallint,
REMARKS varchar(254) ,
COLUMN_DEF nvarchar(2000),
SQL_DATA_TYPE smallint ,
SQL_DATETIME_SUB smallint ,
CHAR_OCTET_LENGTH int,
ORDINAL_POSITION int ,
IS_NULLABLE varchar(254) ,
IsKeyField tinyint
)/*一个临时表存放主键定义*/
create table #pkeys (
DatabaseName sysname,
Owner sysname,
tableName sysname,
columnName sysname,
keyseq smallint,
pkname sysname
)/*一个临时表存放业务类定义*/
create table #BussinessDef(
[BussinessName] [varchar] (50),/*业务类名称*/
[MainTableName] [varchar] (50),/*主表名*/
[BaseFields] [varchar] (2000),/*所有字段列表*/
[KeyFields] [varchar] (2000),/*关键字段列表*/
)/*一个临时表存放查询定义*/
create table #QueryDef(
[QueryName] [varchar] (50) ,
[AllFields] [varchar] (4000)
)/*一个临时表存放字段的中文描述*/
create table #ColDescript (
TableName sysname,
ColumnName sysname,
ColumnDescript varchar(100)
)/*一个临时表存放外键定义*/
create table #ForeignKeyDefs (
[PKTABLE_QUALIFIER] [nvarchar] (128),
[PKTABLE_OWNER] [nvarchar] (128),
[PKTABLE_NAME] [nvarchar] (128),
[PKCOLUMN_NAME] [nvarchar] (128),
[FKTABLE_QUALIFIER] [nvarchar] (128),
[FKTABLE_OWNER] [nvarchar] (128),
[FKTABLE_NAME] [nvarchar] (128),
[FKCOLUMN_NAME] [varchar] (32),
[KEY_SEQ] [smallint],
[UPDATE_RULE] [smallint],
[DELETE_RULE] [smallint],
[FK_NAME] [nvarchar] (128),
[PK_NAME] [nvarchar] (128),
[DEFERABLITY] [smallint]
) /*取得数据库所有字段的描述*/
insert into #ColDescript
select distinct
sysobjects.[name] as tablename,
syscolumns.[name] as columnname ,
cast(sysproperties.value as varchar(100)) as [descript]
From
sysobjects,syscolumns ,sysproperties
where
sysobjects.id = syscolumns.id and
sysproperties.id=sysobjects.id and
sysproperties.smallid = syscolumns.colid/*选择本数据库中的所有表和视图*/
declare crTableList cursor FAST_FORWARD READ_ONLY For
select [name],[type] From [dbo].[sysobjects] where type='U' or type='V'
order by TYPEOpen crTableList/*取得一个表的名称和表的类型*/
fetch next from crTableList into @TableName,@TableTypewhile (@@FETCH_STATUS <> -1)
begin
/*取得表@TableName的主键值列表*/
insert into #pkeys exec sp_pkeys @TableName
/*取得表@TableName的列定义临时列表*/
insert into #ColumnList exec sp_columns @TableName
/*取得表@TableName的所有外键列表*/
insert into #ForeignKeyDefs exec sp_fkeys @TableName
/*取得本表各列的游标*/
declare crCols cursor FAST_FORWARD READ_ONLY for
Select COLUMN_NAME From #ColumnList
Where TABLE_NAME=@TableName Order by Ordinal_Position
Open crCols fetch next from crCols into @ColumnName Select @ColList = ''
Select @KeyFields = '' while (@@FETCH_STATUS <> -1)
begin if EXISTS(Select * from #pkeys where tablename = @TableName and ColumnName = @ColumnName )
Select @IsKeyField = 1
else
Select @IsKeyField = 0 Select @ColList = @ColList + @TableName + '.' +@ColumnName + ';' if @IsKeyField = 1
Select @KeyFields = @TableName + '.' + @ColumnName + ';' + @KeyFields Update #ColumnList Set IsKeyField = @IsKeyField where Table_Name = @TableName and
Column_Name = @ColumnName fetch next from crCols into @ColumnName end
if @TableType = 'U'
/*如果是用户表*/
begin
/*插入一条业务类定义纪录*/
insert into #BussinessDef(BussinessName,MainTableName,BaseFields,KeyFields)
values (@TableName,@TableName,@ColList,@KeyFields)
/*插入一条查询定义纪录*/
insert into #QueryDef(QueryName,AllFields)
values (@TableName,@ColList)
end
else
/*如果是视图*/
begin
/*插入一条查询定义纪录,主要用于业务填写表格界面*/
insert into #QueryDef(QueryName,AllFields)
values (@TableName,@ColList)
/* 插入另外一条查询定义纪录,后缀为Query,主要用于查询报表*/
解决方案 »
- 学习sql有关xml无从下手 请朋友们给点建议 20101013 15:49 在线等
- 求一语句!!
- 键列信息不足或不正确,删除影响到多行,如何处理?谢谢!解决了,即刻给分!
- 为什么我的sql server 的有一个数据库的事务日志文件总是会增加到2G,请问如何是好?
- 附加數據庫時出 錯誤:9003:LSN(3905:241:1)無效!該如何處理?
- 急!!!!!嫩鸟的呼声
- 还是链接paradox服务器问题
- 问一个笨笨的问题,Access、Foxpro与Oracle、SQL Server在数据处理方面有那些不同?
- sql语句如何让所查询的两个表的数据再次查询合并成一个表?
- xampp#2002无法登录mysql服务器解决办法
- 这样的错误我要怎么改,在线等待!!!1
- 如何实现这样的自动更新?
values (@TableName+'Query',@ColList)
end
close crCols
deallocate crCols
fetch next from crTableList into @TableName,@TableType
Delete #pkeysend
close crTableList
deallocate crTableList/*
[FieldName] [nvarchar] [TableName] [Value] [OldValue]
[DisplayName] [DataType] [FieldType]
[FieldLength] [AllowNull]
[Precision] [Scale] [DefaultValue]
[IsKeyField] [QueryName]
*/declare crFieldDefinition cursor FAST_FORWARD READ_ONLY For
select table_Name + '.' + column_name, table_name,ORDINAL_POSITION,[type_name],
length,Nullable,[precision],scale,column_def,IsKeyField From #ColumnList Order by Ordinal_Position
Open crFieldDefinitionfetch next from crFieldDefinition into @ColumnName,@TableName,@FieldIndex,@TypeName,
@Length,@Nullable,@Precision,@scale,@ColumnDef,@IsKeyFieldwhile (@@FETCH_STATUS <> -1)
begin Select @DisplayName = isnull((
Select Distinct ColumnDescript From #ColDescript
Where (
Upper(TableName)=Upper(@TableName) and
Upper( TableName + '.' + ColumnName) = Upper(@ColumnName)
) or
(
Upper(TableName+'View')=Upper(@TableName) and
Upper( TableName+'View' + '.' + ColumnName) = Upper(@ColumnName)
)
),'') Select @QueryName = isnull((
Select Distinct PKTABLE_NAME From #ForeignKeyDefs
Where (
Upper(FKTABLE_NAME)=Upper(@TableName) and
Upper( FKTABLE_NAME + '.' + FKCOLUMN_NAME) = Upper(@ColumnName)
) or
(
Upper(FKTABLE_NAME+'View')=Upper(@TableName) and
Upper( FKTABLE_NAME+'View' + '.' + FKCOLUMN_NAME) = Upper(@ColumnName)
)
)
,'')
if (Select Count(*) From FieldDefinition where FieldName = @ColumnName) < 1
insert into FieldDefinition(FieldName,TableName,FieldIndex,DataType,FieldLength,AllowNull,
[Precision],scale,DefaultValue,IsKeyField,DisplayName,QueryName) values
(@ColumnName,@TableName,@FieldIndex,@TypeName,@Length,@Nullable,@Precision,@scale,@ColumnDef,
@IsKeyField,@DisplayName,@QueryName)
else
update FieldDefinition set FieldName=@ColumnName,TableName=@TableName,FieldIndex=@FieldIndex,
DataType=@TypeName,FieldLength=@Length,AllowNull=@Nullable,[Precision]=@Precision,
scale=@scale,DefaultValue=@ColumnDef,IsKeyField=@IsKeyField ,DisplayName=@DisplayName,
QueryName=@QueryName
where FieldName=@ColumnName fetch next from crFieldDefinition into @ColumnName,@TableName,@FieldIndex,@TypeName,
@Length,@Nullable,@Precision,@scale,@ColumnDef,@IsKeyFieldendclose crFieldDefinition
deallocate crFieldDefinition/*********************************/
declare crBussinessDef cursor FAST_FORWARD READ_ONLY for
select [BussinessName] ,[MainTableName] ,[BaseFields] ,[KeyFields]
From #BussinessDefOpen crBussinessDef
fetch next from crBussinessDef into @BussinessName,@TableName,@BaseFields,@KeyFields
while (@@FETCH_STATUS <> -1)
begin if (Select Count(*) From BussinessDef where BussinessName = @BussinessName) < 1
insert into BussinessDef(BussinessName,MainTableName,BaseFields,Keyfields)
values(@BussinessName,@TableName,@BaseFields,@KeyFields)
else
update BussinessDef set BussinessName=@BussinessName, MainTableName=@TableName,
BaseFields=@BaseFields,KeyFields=@KeyFields
where BussinessName = @BussinessName fetch next from crBussinessDef into @BussinessName,@TableName,@BaseFields,@KeyFieldsendclose crBussinessDef
deallocate crBussinessDef
/**************************************/
declare crQueryDef cursor FAST_FORWARD READ_ONLY for
select [QueryName],[AllFields] From #QueryDefopen crQueryDef
fetch next from crQueryDef into @QueryName ,@AllFields
while (@@FETCH_STATUS <> -1)
begin Select @CheckTableName=Upper(@QueryName)
if not (
(@QueryName='DOMAINQUERY')
or (@QueryName='SYSTEMUSERVIEWQUERY')
or (@QueryName='VOUCHERVIEWQUERY')
or (@QueryName='ASSETCOMPANYVIEWQUERY')
)
/*有些表的QueryDef要手工填写,不允许自动填写*/
begin
if (Select Count(*) From QueryDef where QueryName = @QueryName) < 1
insert into QueryDef(QueryName,AllFields) values(@QueryName,@AllFields)
else
update QueryDef set AllFields=@AllFields
where QueryName = @QueryName
end fetch next from crQueryDef into @QueryName ,@AllFields
end
close crQueryDef
deallocate crQueryDef
drop table #ColumnList
drop table #BussinessDef
drop table #QueryDef
drop table #ColDescript
drop table #ForeignKeyDefs
@v_tableName varchar(256)
as
declare @i_objectId int, -- 對象id
@i_indId smallint, -- 索引id
@v_pkInfo varchar(100), -- 主鍵信息
@v_clusteredInfo varchar(20), -- clustered信息
@v_pkCol varchar(100), -- 主鍵字段
@v_key varchar(50),
@i_i smallint
set @i_objectId = object_id(@v_tableName)
if @i_objectId is null -- 判斷對象是否存在
begin
print 'The object not exists'
return
end
if OBJECTPROPERTY(@i_objectId,'IsTable') <> 1 -- 判斷對象是否是table
begin
print 'The object is not table'
return
end create table #temp1
(
i_id int identity,
v_desc varchar(200)
) insert into #temp1(v_desc)
values('create table '+@v_tableName+'(') -- insert into #temp1(v_desc) -- 將表的字段信息存入臨時表
select a.name+space(4)+b.name+
case when b.xtype in (167,175,231,239) then '('+cast(a.length as varchar)+')'
when b.xtype in (106,108) then '('+cast(a.xprec as varchar)+','+cast(a.xscale as varchar)+')'
else '' end+space(4)+
case when (a.colstat & 1 = 1) then 'identity('+cast(ident_seed(@v_tableName) as varchar)+',' +
cast(ident_incr(@v_tableName) as varchar)+')' else '' end +space(4)+
case a.isnullable when 0 then 'not null' else 'null' end+'|'
from syscolumns a,systypes b
where a.id = @i_objectId and a.xtype = b.xusertype
order by a.colid create procedure 名
@aa varchar(10)
as
begin
select a.id 编号,a.name 名称,b.id,b.name from table1 a join table2 b on a.id=b.id where
endif exists(select 1 from sysobjects where parent_obj = @i_objectId and xtype = 'PK') -- 如果存在主鍵
begin
select @v_pkInfo = b.name,@i_indId = indid, -- 得到主鍵名,id及是否clustered信息
@v_clusteredInfo = (case when (a.status & 16)=16 then 'clustered' else 'nonclustered' end )
from sysindexes a,sysobjects b
where a.id = b.parent_obj and a.name = b.name and b.xtype = 'PK' and b.parent_obj = @i_objectId select @v_pkCol = index_col(@v_tableName, @i_indId, 1), @i_i = 2 -- 得到主鍵的第1個字段名
select @v_key = index_col(@v_tableName, @i_indId, @i_i) -- 得到主鍵的第2個字段名
while (@v_key is not null)
begin
select @v_pkCol = @v_pkCol + ',' + @v_key, @i_i = @i_i + 1
select @v_key = index_col(@v_tableName, @i_indId, @i_i) -- 得到主鍵的第@i_i個字段名
end -- 組合成主鍵信息
set @v_pkInfo = 'constraint '+@v_pkInfo+' primary key '+@v_clusteredInfo+'('+@v_pkCol+')'
insert into #temp1(v_desc) values(@v_pkInfo) -- 將主鍵信息插入臨時表
end
else
begin
select @i_i = count(1) from #temp1
-- 如果沒有主鍵,那麼將最後一筆紀錄的'|'去掉
update #temp1 set v_desc = replace(v_desc,'|','') where i_id = @i_i
end insert into #temp1(v_desc) values(')') --
update #temp1 set v_desc = replace(v_desc,'|',',') select v_desc from #temp1 order by i_id drop table #temp1
是不是我表达错误
我现在问:能不能把sqlserver的导成sql文件!!!!!自己写程序。。那个命令是导数据库的,sqlserver??????????请高人解释上面的语句,谢谢
我没测过,但应该可以的!
(比如:mysql下面: mysqldump db_name>*.sql)???