[英]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.