简体   繁体   English

从SQL中的另一个表中获取列名

[英]Fetching column names from another table in SQL

I have two tables, one holding the actual data and another with human readable names for the columns. 我有两个表,一个表保存实际数据,另一个表具有列的可读名称。

The table holding the data is queried as follows. 如下查询保存数据的表。

SELECT 
       [H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E]
      ,[H8319D956-2223-41DC-AE91-B504832B8665]
      ,[H05E82ED3-517B-4545-A44E-1BDC2126A3AD]
      ,[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E]
FROM [Database].[dbo].[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]

In addition I have a 'meta' table with the actual names of the columns and the table itself. 另外,我有一个“元”表,其中包含列的实际名称和表本身。

Name                                    DisplayName Table                                       DisplayTable
[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E] [ID]        [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]   [Datatable]
[H8319D956-2223-41DC-AE91-B504832B8665] [Name]      [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]   [Datatable]
[H05E82ED3-517B-4545-A44E-1BDC2126A3AD] [City]      [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]   [Datatable]
[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E] [Country]   [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]   [Datatable]

I'm looking for a way to replace what I suspect to be unique identifiers with the human readable names from the other table. 我正在寻找一种方法,用其他表中的可读名称替换我怀疑是唯一标识符的内容。 I have multiple of these tables with a total of over 200 columns which are constantly expanding in length and width (with columns being added). 我有多个这样的表,总共有200多个列,它们的长度和宽度在不断扩大(添加了列)。

I suggest to create a copy of the tables with a select into which maps the column names to their display names. 我建议创建一个带有选择的表的副本,将列名映射到它们的显示名。 The only challenge is to create a series of 200 select into and execute them. 唯一的挑战是创建一系列200个select并执行它们。 A view would work the same way, but id you want to create indexes it will be a challenge. 视图将以相同的方式工作,但是要创建索引的id将是一个挑战。 All depends on the size of the tables and how frequently they have to be refreshed. 所有这些都取决于表的大小以及必须多长时间刷新一次。

You can create the series with a SELECT against a combination of your meta table and the sys.tables, sys.columns and sys.schemas, using quotes and + to concatenate the query into a single line that does the SELECT INTO. 您可以针对您的元表以及sys.tables,sys.columns和sys.schemas的组合,使用SELECT创建系列,使用引号和+将查询连接到执行SELECT INTO的一行中。 You output this into a memory table called @Query. 您将其输出到名为@Query的内存表中。 Then you loop through @Query and execute one by one each line in dynamic SQL. 然后,您遍历@Query并在动态SQL中每行一次执行。

Below is the join of sys.tables, sys.columns and sys.schemas which you should join against your meta table (this will help validating the column names to spot mistakes) 下面是sys.tables,sys.columns和sys.schemas的联接,您应该将它们联接到元表中(这将有助于验证列名以发现错误)

SELECT 
s.name AS schema_name,
t.name AS table_name, 
c.name AS column_name
    FROM sys.tables t JOIN sys.columns c ON c.object_id = t.object_id JOIN sys.schemas s ON t.schema_id = s.schema_id 

The following code demonstrates one way of swapping column names. 以下代码演示了交换列名称的一种方法。 Rather than generating a select query it could be modified to generate a statement to create a stored procedure or view. 除了生成select查询,还可以对其进行修改以生成用于创建存储过程或视图的语句。

-- Sample data.
create table Metadata ( MetadataId Int Identity,
  TableName VarChar(16), ColumnName VarChar(16), DisplayName VarChar(16) );
insert into Metadata ( TableName, ColumnName, DisplayName ) values
  ( 'Samples', '001', 'ShoeSize' ), ( 'Samples', '042', 'TowelLocation' ),
  ( 'Widgets', 'BR549', 'RingTwo' );
select * from Metadata;

create table Samples ( SampleId Int Identity,
  [001] VarChar(5), [042] VarChar(64) );
insert into Samples ( [001], [042] ) values
  ( '5EEE', 'Left shoulder.' ), ( '14', 'Front hall closet.' );
select * from Samples;

-- Build a query.
declare @TableName as sysname = 'Samples';
declare @ColumnList as NVarChar(2048) = N'';
select @ColumnList = Stuff(
    ( select N',' + QuoteName( M.DisplayName ) + N'=' + QuoteName( M.ColumnName )  
     from sys.columns as C inner join
    Metadata as M on M.TableName = @TableName and M.ColumnName = C.name
  where object_id = Object_Id( @TableName )
  order by column_id for XML path(''), type).value('.[1]', 'VarChar(max)' ),
    1, 1, '' );
declare @Query as NVarChar(4000) = N'select ' + @ColumnList + N' from ' + QuoteName( @TableName );

-- Try it on for size.
select @Query as Query;
execute sp_executesql @statement = @Query;

-- Houseclean.
drop table Samples;
drop table Metadata;

Now as far as i have understood your issue, You need to replace Name of the Table and Column from Unique Identifier form to Human Readable form based on Data available in Meta table. 现在,据我所知,您需要根据元表中可用的数据将“表名和列名”从“唯一标识符”表单替换为“人类可读”表单。

Now, First create a table whose column and table name needs to be changed 现在,首先创建一个表,该表的列和表名需要更改

--Table whose column name and Table name needs to be changed
CREATE TABLE [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]
(
[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E] VARCHAR(100),
[H8319D956-2223-41DC-AE91-B504832B8665] VARCHAR(100),
[H05E82ED3-517B-4545-A44E-1BDC2126A3AD] VARCHAR(100),
[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E]  VARCHAR(100)
)

--Meta Table 

CREATE TABLE Meta
(
Name VARCHAR(100),
DisplayName VARCHAR(100),
[Table] VARCHAR(100),
DisplayTable VARCHAR(100)
)


INSERT INTO Meta VALUES ('[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E]','[ID]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]')
INSERT INTO Meta VALUES ('[H8319D956-2223-41DC-AE91-B504832B8665]','[Name]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]')
INSERT INTO Meta VALUES ('[H05E82ED3-517B-4545-A44E-1BDC2126A3AD]','[City]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]')
INSERT INTO Meta VALUES ('[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E]','[Country]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]')

Now changing the column name in SQL Server is done using sp_rename procedure, So we will need to create a script that will on Meta table and will provide you output in sp_rename format. 现在,使用sp_rename过程在SQL Server中更改列名,因此,我们将需要创建一个脚本,该脚本将在Meta表上并以sp_rename格式提供输出。 Following example will make it clear 以下示例将使之更清楚

--Required Script
SELECT *,'EXEC sp_rename '''+ [Table] + '.' + Name + '''' + ',''' + DisplayName + '''' + ',' + '''COLUMN' + '''' AS Rename_Script FROM Meta

Output of this script will include a column "Rename_Script", which on running will alter the name of the column in [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA] as mentioned by you in example. 该脚本的输出将包括“ Rename_Script”列,该列在运行时将更改您在示例中提到的[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]中的列名称。

EXEC sp_rename '[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA].[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E]','[ID]','COLUMN'
EXEC sp_rename '[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA].[H8319D956-2223-41DC-AE91-B504832B8665]','[Name]','COLUMN'
EXEC sp_rename '[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA].[H05E82ED3-517B-4545-A44E-1BDC2126A3AD]','[City]','COLUMN'
EXEC sp_rename '[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA].[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E]','[Country]','COLUMN'

Similarly, You need to create a script for changing Table name. 同样,您需要创建一个用于更改表名称的脚本。 Please let me know in case you face any issues with the same. 如果您遇到相同的任何问题,请告诉我。

    IF OBJECT_ID('tempdb..#t') IS NOT NULL DROP TABLE #t
    CREATE TABLE #t(Name VARCHAR(255),DisplayName VARCHAR(255),[Table] VARCHAR(255),DisplayTable VARCHAR(255))
    INSERT INTO #t(Name,DisplayName,[Table],DisplayTable) 
    SELECT '[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E]','[ID]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]' UNION ALL 
    SELECT '[H8319D956-2223-41DC-AE91-B504832B8665]','[Name]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]' UNION ALL 
    SELECT '[H05E82ED3-517B-4545-A44E-1BDC2126A3AD]','[City]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]' UNION ALL 
    SELECT '[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E]','[Country]','[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]','[Datatable]'

    DECLARE @sql VARCHAR(max),@tablename VARCHAR(255)
    SET @tablename='[DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]'
    SELECT @sql=ISNULL(@sql+',','')+'t.'+t.Name+' AS '+t.DisplayName
    FROM #t AS t WHERE t.[Table]=@tablename
    SET @sql='SELECT '+CHAR(13)+@sql +CHAR(13)+'FROM '+@tablename
    PRINT @sql
    'EXEC(@sql)
SELECT 
t.[H08CEC38C-281B-4C28-90DE-EEEC1D3C4D2E] AS [ID],t.[H8319D956-2223-41DC-AE91-B504832B8665] AS [Name],t.[H05E82ED3-517B-4545-A44E-1BDC2126A3AD] AS [City],t.[H519574FD-EFC4-4BFB-8BC9-447FF61E0C0E] AS [Country]
FROM [DIM4DE53E67-85C8-4274-B5ED-5F3526314DEA]

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM