求问SQLServer多个表中将重复的数据提取到新表,并统计重复次数
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求问SQLServer多个表中将重复的数据提取到新表,并统计重复次数相关的知识,希望对你有一定的参考价值。
请教大家,我有001-008这8个表,每个表的结构是一样的,但是每个表的内容不太一样,且各个表之间有可能有重复的信息。比如001里面是外语的培训机构(地址、电话)。002里面是绘画的培训机构(地址、电话),那么有可能有一家培训机构可能同时存在于001和002中。
现在想通过查询语句将这几个表中的重复信息提取出来并放到一个新表009中,表的最后一列要出现重复的次数。
请问谁有好的方法吗,最好能详细一点,本人刚学是新手,谢谢大家
use XLERP
--1、查询重复数据
SELECT cInvCode, cAcc_Id,count(*)FROM Attribute GROUP BY cInvCode, cAcc_Id HAVING count(*) > 1
--2、选择重复值到临时表
SELECT cInvCode, cAcc_Id,bSale, bPurchase, bSelf, bComsume, bProducing, bService, bAccessary, bInvType, bPropertyCheck, bPlanInv, bProxyForeign, bATOModel, bCheckItem, bPTOModel, bMPS, bROP, bCutMantissa, bInvModel, iInvNCost, iTopSum, iLowSum, iSafeNum, fOutExcess, cInvABC, dSDate, dEDate, cCreatePerson, cModifyPerson, dModifyDate,col3=count(*) INTO holdkey FROM Attribute GROUP BY cInvCode, cAcc_Id,bSale, bPurchase, bSelf, bComsume, bProducing, bService, bAccessary, bInvType, bPropertyCheck, bPlanInv, bProxyForeign, bATOModel, bCheckItem, bPTOModel, bMPS, bROP, bCutMantissa, bInvModel, iInvNCost, iTopSum, iLowSum, iSafeNum, fOutExcess, cInvABC, dSDate, dEDate, cCreatePerson, cModifyPerson, dModifyDate HAVING count(*) > 1
--3、选择重复的行放入临时表中,以清除进程中的重复值
SELECT DISTINCT Attribute.* INTO holddups FROM Attribute, holdkey WHERE Attribute.cInvCode = holdkey.cInvCode AND Attribute.cAcc_Id = holdkey.cAcc_Id
--4、验证 holddups 中的各个键是否唯一
SELECT cInvCode, cAcc_Id, count(*) FROM holddups GROUP BY cInvCode, cAcc_Id
--5、从原始表中删除重复的行
DELETE Attribute FROM Attribute, holdkey WHERE Attribute.cInvCode = holdkey.cInvCode AND Attribute.cAcc_Id = holdkey.cAcc_Id
--6、将唯一行放回原始表中
INSERT Attribute SELECT * FROM holddups
--7、删除临时表
drop table holddups
drop table holdkey追问
您这个是单表吧,多表是不是要复杂
参考技术B select * from 001 as a inner join 002 as bon a.地址=b.地址
这样就得出相同的数据
单表统计相同个数
select 地址 from 001
group by 地址
having count(地址)>1
后面的逻辑你自己解决!追问
这8个表该怎么写呀
追答用游标循环就可以。这个可能会比较耗时,如果8个表,嵌入循环。
本回答被提问者采纳SQL Server:提取表元数据(描述、字段及其数据类型)
【中文标题】SQL Server:提取表元数据(描述、字段及其数据类型)【英文标题】:SQL Server: Extract Table Meta-Data (description, fields and their data types) 【发布时间】:2010-10-27 14:33:15 【问题描述】:我正在尝试找到一种方法来提取有关我在 SQL Server (2008) 中的表的信息。 我需要的数据需要包括表的描述(从属性窗口中的描述属性填充)、该表的字段列表及其各自的数据类型。
有什么方法可以提取这些元数据?我想我必须使用一些 sys
sp 但我不确定是哪一个。
【问题讨论】:
顺便说一句...你在哪里可以看到描述?它似乎没有显示在 Management Studio 的属性中。 当您修改表(设计)时,它位于“属性”窗口中...在“数据库名称”下方和“架构”上方(在 sql server 2008 中) 回复您的评论;它应该是 = 0(不是 IS NULL);但必须对其进行过滤以避免您在表格中找到列描述 【参考方案1】:有两种简单的方法:
选项 1
sp_help 'schema.table_name'
选项 2
SELECT * FROM INFORMATION_SCHEMA.columns c WHERE c.table_name = 'table_name'
【讨论】:
【参考方案2】:获取基本元数据摘要的最简单方法是使用临时表,然后使用 EXEC 函数:
SELECT * INTO #TempTable FROM TableName
EXEC [tempdb].[dbo].[sp_help] N'#TempTable'
对于表中的所有列,这将为您提供 列名, 数据类型, 计算长度, 前言, 规模, 可空, 修剪尾随空白, 固定LenNullInSource, 排序规则类型
【讨论】:
【参考方案3】:看看这个:
SELECT TABLE_SCHEMA ,
TABLE_NAME ,
COLUMN_NAME ,
ORDINAL_POSITION ,
COLUMN_DEFAULT ,
DATA_TYPE ,
CHARACTER_MAXIMUM_LENGTH ,
NUMERIC_PRECISION ,
NUMERIC_PRECISION_RADIX ,
NUMERIC_SCALE ,
DATETIME_PRECISION
FROM INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA in ('dbo','meta')
and table_name in (select name from sys.tables)
order by TABLE_SCHEMA , TABLE_NAME ,ORDINAL_POSITION
【讨论】:
【参考方案4】:有关表和列的一般信息可以在这些表中找到:
select * from INFORMATION_SCHEMA.TABLES
select * from INFORMATION_SCHEMA.COLUMNS
表描述是扩展属性,可以从sys.extended_properties查询:
select
TableName = tbl.table_schema + '.' + tbl.table_name,
TableDescription = prop.value,
ColumnName = col.column_name,
ColumnDataType = col.data_type
FROM information_schema.tables tbl
INNER JOIN information_schema.columns col
ON col.table_name = tbl.table_name
AND col.table_schema = tbl.table_schema
LEFT JOIN sys.extended_properties prop
ON prop.major_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND prop.minor_id = 0
AND prop.name = 'MS_Description'
WHERE tbl.table_type = 'base table'
【讨论】:
您可能需要小心调用 OBJECT_ID() 以消除与不同所有者的歧义 MS_Description_Table?另外——表元数据和列元数据分开存储;你需要适当地处理minor_id 好点都编辑了!除了minor_id,根据您对答案的评论,它似乎不起作用。 就像我对 Marc 说的,当你包含 'prop.minor_id IS NULL' 时,描述不会被检索,但是当你删除它时,它会起作用 我建议也加入架构...当存在具有相同名称但架构不同的表时,可能会有点粗略。INNER JOIN information_schema.columns col ON col.table_name = tbl.table_name AND col.TABLE_SCHEMA = tbl.TABLE_SCHEMA order by col.TABLE_NAME
【参考方案5】:
我刚刚完成了一个 .net 库,其中包含一些有用的查询,这些查询返回代码 gen/t4 模板的强类型 C# 对象。
nuget SqlMeta
Project Site
github source
/// <summary>
/// Get All Table Names
/// </summary>
/// <returns></returns>
public List<string> GetTableNames()
var sql = @"SELECT name
FROM dbo.sysobjects
WHERE xtype = 'U'
AND name <> 'sysdiagrams'
order by name asc";
return databaseWrapper.Call(connection => connection.Query<string>(
sql: sql))
.ToList();
/// <summary>
/// Get table info by schema and table or null for all
/// </summary>
/// <param name="schema"></param>
/// <param name="table"></param>
/// <returns></returns>
public List<SqlTableInfo> GetTableInfo(string schema = null, string table = null)
var result = new List<SqlTableInfo>();
var sql = @"SELECT
c.TABLE_CATALOG AS [TableCatalog]
, c.TABLE_SCHEMA AS [Schema]
, c.TABLE_NAME AS [TableName]
, c.COLUMN_NAME AS [ColumnName]
, c.ORDINAL_POSITION AS [OrdinalPosition]
, c.COLUMN_DEFAULT AS [ColumnDefault]
, c.IS_NULLABLE AS [Nullable]
, c.DATA_TYPE AS [DataType]
, c.CHARACTER_MAXIMUM_LENGTH AS [CharacterMaxLength]
, c.CHARACTER_OCTET_LENGTH AS [CharacterOctetLenth]
, c.NUMERIC_PRECISION AS [NumericPrecision]
, c.NUMERIC_PRECISION_RADIX AS [NumericPrecisionRadix]
, c.NUMERIC_SCALE AS [NumericScale]
, c.DATETIME_PRECISION AS [DatTimePrecision]
, c.CHARACTER_SET_CATALOG AS [CharacterSetCatalog]
, c.CHARACTER_SET_SCHEMA AS [CharacterSetSchema]
, c.CHARACTER_SET_NAME AS [CharacterSetName]
, c.COLLATION_CATALOG AS [CollationCatalog]
, c.COLLATION_SCHEMA AS [CollationSchema]
, c.COLLATION_NAME AS [CollationName]
, c.DOMAIN_CATALOG AS [DomainCatalog]
, c.DOMAIN_SCHEMA AS [DomainSchema]
, c.DOMAIN_NAME AS [DomainName]
, IsPrimaryKey = CONVERT(BIT, (SELECT
COUNT(*)
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS tc
, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE cu
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
AND tc.CONSTRAINT_NAME = cu.CONSTRAINT_NAME
AND tc.TABLE_NAME = c.TABLE_NAME
AND cu.TABLE_SCHEMA = c.TABLE_SCHEMA
AND cu.COLUMN_NAME = c.COLUMN_NAME)
)
, IsIdentity = CONVERT(BIT, (SELECT
COUNT(*)
FROM sys.objects obj
INNER JOIN sys.COLUMNS col
ON obj.object_id = col.object_id
WHERE obj.type = 'U'
AND obj.Name = c.TABLE_NAME
AND col.Name = c.COLUMN_NAME
AND col.is_identity = 1)
)
FROM INFORMATION_SCHEMA.COLUMNS c
WHERE (@Schema IS NULL
OR c.TABLE_SCHEMA = @Schema)
AND (@TableName IS NULL
OR c.TABLE_NAME = @TableName)
";
var columns = databaseWrapper.Call(connection => connection.Query<SqlColumnInfo>(
sql: sql,
param: new Schema = schema, TableName = table ,
commandType: CommandType.Text)
.ToList());
var refs = this.GetReferentialConstraints(table: table, schema: schema);
foreach (var tableName in columns.Select(info => info.TableName).Distinct())
var tableColumns = columns.Where(info => info.TableName == tableName).ToList();
var children = refs.Where(c => c.UniqueTableName == tableName).ToList();
var parents = refs.Where(c => c.TableName == tableName).ToList();
result.Add(new SqlTableInfo
TableName = tableName,
Columns = tableColumns,
ChildConstraints = children,
ParentConstraints = parents
);
return result;
public List<SqlReferentialConstraint> GetReferentialConstraints(string table = null, string schema = null)
//https://technet.microsoft.com/en-us/library/aa175805%28v=sql.80%29.aspx
//https://technet.microsoft.com/en-us/library/Aa175805.312ron1%28l=en-us,v=sql.80%29.jpg
//https://msdn.microsoft.com/en-us/library/ms186778.aspx
var sql = @"
SELECT
KCU1.CONSTRAINT_NAME AS [ConstraintName]
, KCU1.TABLE_NAME AS [TableName]
, KCU1.COLUMN_NAME AS [ColumnName]
, KCU2.CONSTRAINT_NAME AS [UniqueConstraintName]
, KCU2.TABLE_NAME AS [UniqueTableName]
, KCU2.COLUMN_NAME AS [UniqueColumnName]
, RC.MATCH_OPTION AS [MatchOption]
, RC.UPDATE_RULE AS [UpdateRule]
, RC.DELETE_RULE AS [DeleteRule]
FROM INFORMATION_SCHEMA.REFERENTIAL_CONSTRAINTS RC
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU1 ON KCU1.CONSTRAINT_CATALOG = RC.CONSTRAINT_CATALOG
AND KCU1.CONSTRAINT_SCHEMA = RC.CONSTRAINT_SCHEMA
AND KCU1.CONSTRAINT_NAME = RC.CONSTRAINT_NAME
LEFT JOIN INFORMATION_SCHEMA.KEY_COLUMN_USAGE KCU2 ON KCU2.CONSTRAINT_CATALOG = RC.UNIQUE_CONSTRAINT_CATALOG
AND KCU2.CONSTRAINT_SCHEMA = RC.UNIQUE_CONSTRAINT_SCHEMA
AND KCU2.CONSTRAINT_NAME = RC.UNIQUE_CONSTRAINT_NAME
WHERE KCU1.ORDINAL_POSITION = KCU2.ORDINAL_POSITION
AND (@Table IS NULL
OR KCU1.TABLE_NAME = @Table
OR KCU2.TABLE_NAME = @Table)
AND (@Schema IS NULL
OR KCU1.TABLE_SCHEMA = @Schema
OR KCU2.TABLE_SCHEMA = @Schema)
";
return databaseWrapper.Call(connection => connection.Query<SqlReferentialConstraint>(
sql: sql,
param: new Table = table, Schema = schema ,
commandType: CommandType.Text))
.ToList();
/// <summary>
/// Get Primary Key Column by schema and table name
/// </summary>
/// <param name="schema"></param>
/// <param name="tableName"></param>
/// <returns></returns>
public string GetPrimaryKeyColumnName(string schema, string tableName)
var sql = @"SELECT
B.COLUMN_NAME
FROM INFORMATION_SCHEMA.TABLE_CONSTRAINTS A
, INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE B
WHERE CONSTRAINT_TYPE = 'PRIMARY KEY'
AND A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
AND A.TABLE_NAME = @TableName
AND A.TABLE_SCHEMA = @Schema";
return databaseWrapper.Call(connection => connection.Query<string>(
sql: sql,
param: new TableName = tableName, Schema = schema ,
commandType: CommandType.Text))
.SingleOrDefault();
/// <summary>
/// Get Identity Column by table name
/// </summary>
/// <param name="tableName"></param>
/// <returns></returns>
public string GetIdentityColumnName(string tableName)
var sql = @"SELECT
c.Name
FROM sys.objects o
INNER JOIN sys.columns c ON o.object_id = c.object_id
WHERE o.type = 'U'
AND c.is_identity = 1
AND o.Name = @TableName";
return databaseWrapper.Call(connection => connection.Query<string>(
sql: sql,
param: new TableName = tableName ,
commandType: CommandType.Text))
.SingleOrDefault();
/// <summary>
/// Get All Stored Procedures by schema
/// </summary>
/// <param name="schema"></param>
/// <param name="procName"></param>
/// <returns></returns>
public List<SqlStoredProcedureInfo> GetStoredProcedureInfo(string schema = null, string procName = null)
var result = new List<SqlStoredProcedureInfo>();
var sql = @"SELECT
SPECIFIC_NAME AS [Name]
, SPECIFIC_SCHEMA AS [Schema]
, Created AS [Created]
, LAST_ALTERED AS [LastAltered]
FROM INFORMATION_SCHEMA.ROUTINES
WHERE ROUTINE_TYPE = 'PROCEDURE'
AND (SPECIFIC_SCHEMA = @Schema
OR @Schema IS NULL)
AND (SPECIFIC_NAME = @ProcName
OR @ProcName IS NULL)
AND ((SPECIFIC_NAME NOT LIKE 'sp_%'
AND SPECIFIC_NAME NOT LIKE 'procUtils_GenerateClass'
AND (SPECIFIC_SCHEMA = @Schema
OR @Schema IS NULL))
OR SPECIFIC_SCHEMA <> @Schema)";
var sprocs = databaseWrapper.Call(connection => connection.Query<SqlStoredProcedureInfo>(
sql: sql,
param: new Schema = schema, ProcName = procName ,
commandType: CommandType.Text).ToList());
foreach (var s in sprocs)
s.Parameters = GetStoredProcedureInputParameters(sprocName: s.Name, schema: schema);
s.ResultColumns = GetColumnInfoFromStoredProcResult(storedProcName: s.Name, schema: schema);
result.Add(s);
return result;
/// <summary>
/// Get Column info from Stored procedure result set
/// </summary>
/// <param name="schema"></param>
/// <param name="storedProcName"></param>
/// <returns></returns>
public List<DataColumn> GetColumnInfoFromStoredProcResult(string schema, string storedProcName)
//this one actually needs to use the dataset because it has the only accurate information about columns and if they can be null or not.
var sb = new StringBuilder();
if (!String.IsNullOrEmpty(schema))
sb.Append(String.Format("exec [0].[1] ", schema, storedProcName));
else
sb.Append(String.Format("exec [0] ", storedProcName));
var prms = GetStoredProcedureInputParameters(schema, storedProcName);
var count = 1;
foreach (var param in prms)
sb.Append(String.Format("0=null", param.Name));
if (count < prms.Count)
sb.Append(", ");
count++;
var ds = new DataSet();
using (var sqlConnection = (SqlConnection)databaseWrapper.GetOpenDbConnection())
using (var sqlAdapter = new SqlDataAdapter(sb.ToString(), sqlConnection))
if (sqlConnection.State != ConnectionState.Open) sqlConnection.Open();
sqlAdapter.SelectCommand.ExecuteReader(CommandBehavior.SchemaOnly);
sqlConnection.Close();
sqlAdapter.FillSchema(ds, SchemaType.Source, "MyTable");
var list = new List<DataColumn>();
if (ds.Tables.Count > 0)
list = ds.Tables["MyTable"].Columns.Cast<DataColumn>().ToList();
return list;
/// <summary>
/// Get the input parameters for a stored procedure
/// </summary>
/// <param name="schema"></param>
/// <param name="sprocName"></param>
/// <returns></returns>
public List<SqlParameterInfo> GetStoredProcedureInputParameters(string schema = null, string sprocName = null)
var sql = @"SELECT
SCHEMA_NAME(schema_id) AS [Schema]
, P.Name AS Name
, @ProcName AS ProcedureName
, TYPE_NAME(P.user_type_id) AS [ParameterDataType]
, P.max_length AS [MaxLength]
, P.Precision AS [Precision]
, P.Scale AS Scale
, P.has_default_value AS HasDefaultValue
, P.default_value AS DefaultValue
, P.object_id AS ObjectId
, P.parameter_id AS ParameterId
, P.system_type_id AS SystemTypeId
, P.user_type_id AS UserTypeId
, P.is_output AS IsOutput
, P.is_cursor_ref AS IsCursor
, P.is_xml_document AS IsXmlDocument
, P.xml_collection_id AS XmlCollectionId
, P.is_readonly AS IsReadOnly
FROM sys.objects AS SO
INNER JOIN sys.parameters AS P ON SO.object_id = P.object_id
WHERE SO.object_id IN (SELECT
object_id
FROM sys.objects
WHERE type IN ('P', 'FN'))
AND (SO.Name = @ProcName
OR @ProcName IS NULL)
AND (SCHEMA_NAME(schema_id) = @Schema
OR @Schema IS NULL)
ORDER BY P.parameter_id ASC";
var result = databaseWrapper.Call(connection => connection.Query<SqlParameterInfo>(
sql: sql,
param: new Schema = schema, ProcName = sprocName ,
commandType: CommandType.Text))
.ToList();
return result;
Foreign Key Metadata
【讨论】:
【参考方案6】:我最喜欢@Andomar 的回答,但我也需要列说明。这是他的查询修改为也包括这些查询。 (取消注释 WHERE 子句的最后一部分以仅返回其中任一描述为非空的行)。
SELECT
TableName = tbl.table_schema + '.' + tbl.table_name,
TableDescription = tableProp.value,
ColumnName = col.column_name,
ColumnDataType = col.data_type,
ColumnDescription = colDesc.ColumnDescription
FROM information_schema.tables tbl
INNER JOIN information_schema.columns col
ON col.table_name = tbl.table_name
LEFT JOIN sys.extended_properties tableProp
ON tableProp.major_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND tableProp.minor_id = 0
AND tableProp.name = 'MS_Description'
LEFT JOIN (
SELECT sc.object_id, sc.column_id, sc.name, colProp.[value] AS ColumnDescription
FROM sys.columns sc
INNER JOIN sys.extended_properties colProp
ON colProp.major_id = sc.object_id
AND colProp.minor_id = sc.column_id
AND colProp.name = 'MS_Description'
) colDesc
ON colDesc.object_id = object_id(tbl.table_schema + '.' + tbl.table_name)
AND colDesc.name = col.COLUMN_NAME
WHERE tbl.table_type = 'base table'
--AND tableProp.[value] IS NOT NULL OR colDesc.ColumnDescription IS NOT null
【讨论】:
【参考方案7】:select Col.name Columnname,prop.Value Description, tbl.name Tablename, sch.name schemaname
from sys.columns col left outer join sys.extended_properties prop
on prop.major_id = col.object_id and prop.minor_id = col.column_id
inner join sys.tables tbl on col.object_id = tbl.object_id
Left outer join sys.schemas sch on sch.schema_id = tbl.schema_id
【讨论】:
【参考方案8】:根据您需要多少元数据,这对我有用: 哪里可能是 Northwind.dbo.Products 之类的全部内容或只是 Products
SELECT c.name Field,
t.name Type,
c.Precision,
c.Scale,
c.is_nullable,
c.collation_name
FROM sys.columns c
INNER JOIN sys.types t ON t.system_type_id=c.system_type_id
WHERE object_id=object_id('<table to inspect>')
ORDER BY column_id
【讨论】:
【参考方案9】: SELECT
sc.name AS ColumnName
,ep.*
FROM
sys.columns AS sc
INNER JOIN sys.extended_properties AS ep
ON ep.major_id = sc.[object_id]
AND ep.minor_id = sc.column_id
WHERE
--here put your desired table
sc.[object_id] = OBJECT_ID('[Northwind].[dbo].[Products]')
-- this is optional, remove this and you get all extended props
AND ep.name = 'MS_Description'
【讨论】:
【参考方案10】:我使用此 SQL 代码获取有关列的所有信息。
SELECT
COL.COLUMN_NAME,
ORDINAL_POSITION,
DATA_TYPE,
CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION,
NUMERIC_PRECISION_RADIX,
NUMERIC_SCALE,
DATETIME_PRECISION,
IS_NULLABLE,
CONSTRAINT_TYPE,
COLUMNPROPERTY(object_id(COL.TABLE_NAME), COL.COLUMN_NAME, 'IsIdentity') IS_IDENTITY,
COLUMNPROPERTY(object_id(COL.TABLE_NAME), COL.COLUMN_NAME, 'IsComputed') IS_COMPUTED
FROM INFORMATION_SCHEMA.COLUMNS COL
LEFT OUTER JOIN
(
SELECT COLUMN_NAME, CONSTRAINT_TYPE
FROM INFORMATION_SCHEMA.CONSTRAINT_COLUMN_USAGE A
INNER JOIN INFORMATION_SCHEMA.TABLE_CONSTRAINTS B
ON A.CONSTRAINT_NAME = B.CONSTRAINT_NAME
WHERE A.TABLE_NAME = 'User'
) CONS
ON COL.COLUMN_NAME = CONS.COLUMN_NAME
WHERE COL.TABLE_NAME = 'User'
【讨论】:
【参考方案11】:如果您使用 java 代码提取查询,可以使用一个很棒的类 ResultSetMetaData,它可以检索列名和列的属性(类型和长度)。
示例
ResultSet rs = null;
rs = sql.executeQuery();
if (rs != null)
if (rs.next())
ResultSetMetaData rsmd = rs.getMetaData();
for (int i = 1; i <= rsmd.getColumnCount(); i++)
System.out.println("column name: "
+ rsmd.getColumnName(i));
System.out.println("column size: "
+ rsmd.getColumnDisplaySize(i));
【讨论】:
【参考方案12】:如果可以使用 .NET 代码,我建议使用 SMO:http://msdn.microsoft.com/en-us/library/ms162169.aspx,在您的特定情况下,它将是 Table 类 http://msdn.microsoft.com/en-us/library/microsoft.sqlserver.management.smo.table.aspx 与使用特定于版本的系统视图和表格相比,这将是一种更便携的解决方案。
如果这是您要定期使用的东西 - 您可能想编写一个简单的控制台应用程序,也许使用运行时 T4 代码生成器http://msdn.microsoft.com/en-us/library/ee844259.aspx
如果这只是一项一次性任务 - 您可以使用我的 LiveDoco (http://www.livedoco.com) 导出到 XML 功能和可选的 XSLT 转换,或者我确信有免费工具可以做到这一点。 这个看起来不错:http://sqldbdoc.codeplex.com/ - 通过 XSLT 支持 XML,但我不确定您是否可以为选择的表运行它(使用 LiveDoco 可以)。
【讨论】:
这些工具看起来很棒!如果我知道那些存在的话,我就不会手动完成 :(【参考方案13】:如果您只是想以方便的方式查看信息,Red Gate 的 SQL Prompt 可能会有所帮助。
如果您将鼠标悬停在查询窗口中的对象文本上,SQL Prompt 将在工具提示中显示 MS_Description 扩展属性文本。单击工具提示将打开一个对话框,显示列信息以及对象的 DDL。
http://www.red-gate.com/products/sql-development/sql-prompt/
【讨论】:
【参考方案14】:使用对象目录视图:
SELECT T.NAME AS [TABLE NAME], C.NAME AS [COLUMN NAME], P.NAME AS [DATA TYPE], P.MAX_LENGTH AS[SIZE], CAST(P.PRECISION AS VARCHAR) +‘/’+ CAST(P.SCALE AS VARCHAR) AS [PRECISION/SCALE]
FROM ADVENTUREWORKS.SYS.OBJECTS AS T
JOIN ADVENTUREWORKS.SYS.COLUMNS AS C
ON T.OBJECT_ID=C.OBJECT_ID
JOIN ADVENTUREWORKS.SYS.TYPES AS P
ON C.SYSTEM_TYPE_ID=P.SYSTEM_TYPE_ID
WHERE T.TYPE_DESC=‘USER_TABLE’;
使用信息架构视图
SELECT TABLE_SCHEMA, TABLE_NAME, COLUMN_NAME, ORDINAL_POSITION,
COLUMN_DEFAULT, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
NUMERIC_PRECISION, NUMERIC_PRECISION_RADIX, NUMERIC_SCALE,
DATETIME_PRECISION
FROM ADVENTUREWORKS.INFORMATION_SCHEMA.COLUMNS
【讨论】:
【参考方案15】:你可以试试sp_help <Name of object>
【讨论】:
注意:我正在使用 SQL Server 2008 Express 尝试此操作,并且转储了许多有用的元数据,但对我而言,它没有选择表或表列的任何描述。 太棒了。这给了我所需的一切,甚至更多,使用 SQL Server 2008(不是 Express)。【参考方案16】:要获取描述数据,很遗憾您必须使用 sysobjects/syscolumns 来获取 id:
SELECT u.name + '.' + t.name AS [table],
td.value AS [table_desc],
c.name AS [column],
cd.value AS [column_desc]
FROM sysobjects t
INNER JOIN sysusers u
ON u.uid = t.uid
LEFT OUTER JOIN sys.extended_properties td
ON td.major_id = t.id
AND td.minor_id = 0
AND td.name = 'MS_Description'
INNER JOIN syscolumns c
ON c.id = t.id
LEFT OUTER JOIN sys.extended_properties cd
ON cd.major_id = c.id
AND cd.minor_id = c.colid
AND cd.name = 'MS_Description'
WHERE t.type = 'u'
ORDER BY t.name, c.colorder
您可以使用 info-schema 来做到这一点,但您必须连接 etc 才能调用 OBJECT_ID() - 那有什么意义呢?
【讨论】:
信息模式似乎更容易检索数据类型。我想你可以在这里通过加入 c.xtype 上的 systype 来检索它。 我同意你的看法; info-schema 使这变得非常容易......两者之间可能有一些理想的合并。 Marc,你为什么要包含 'td.minor_id IS NULL' ?通过此添加,它不会检索描述,但如果我删除它,它会起作用。 DBGizmo 让这项工作变得更容易。以上是关于求问SQLServer多个表中将重复的数据提取到新表,并统计重复次数的主要内容,如果未能解决你的问题,请参考以下文章
sql server 数据库中,2000W行的表数据添加到新表中,新表多几个字段