Sql 从另一个表定义列名
我有两张桌子 表1:Sql 从另一个表定义列名,sql,sql-server,Sql,Sql Server,我有两张桌子 表1: SELECT "ColumnNm" , "ColumnUserFriendlyNm" FROM table_1 这表明: columnNm ColumnUserFriendlyNm key1 friendly name 1 key2 friendly name 2 表2有列名“key1”和“key2”,我想根据表1中的键将这些列名更改为“友好名称1”和“友好
SELECT
"ColumnNm" ,
"ColumnUserFriendlyNm"
FROM table_1
这表明:
columnNm ColumnUserFriendlyNm
key1 friendly name 1
key2 friendly name 2
表2有列名“key1”和“key2”,我想根据表1中的键将这些列名更改为“友好名称1”和“友好名称2”
我需要它是自动的——因此,如果我有1000个这样的列,我不需要一个接一个地在代码中手动写入别名,我希望它能拉取“友好名称”“根据表1中的键,除非在对列进行别名处理后创建一个
派生表
,否则必须在非友好名称上加入。在中选择
可以别名
最终结果集中返回的列:
别名的示例
SELECT
"ColumnNm" as [friendly name 1],
"ColumnUserFriendlyNm" as [friendly name 2]
FROM table_1
create view dbo.vTable1_2
as
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
示例到别名
并使用派生表
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
<>强>如果需要<代码>别名<代码>,请考虑使用<代码>别名<代码>创建查询到<代码>视图>/P>
SELECT
"ColumnNm" as [friendly name 1],
"ColumnUserFriendlyNm" as [friendly name 2]
FROM table_1
create view dbo.vTable1_2
as
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
除非在对列进行别名处理后创建派生表
,否则必须对非友好名称进行联接
。在中选择
可以别名
最终结果集中返回的列:
别名的示例
SELECT
"ColumnNm" as [friendly name 1],
"ColumnUserFriendlyNm" as [friendly name 2]
FROM table_1
create view dbo.vTable1_2
as
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
示例到别名
并使用派生表
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
<>强>如果需要<代码>别名<代码>,请考虑使用<代码>别名<代码>创建查询到<代码>视图>/P>
SELECT
"ColumnNm" as [friendly name 1],
"ColumnUserFriendlyNm" as [friendly name 2]
FROM table_1
create view dbo.vTable1_2
as
SELECT * from (
SELECT
"key1" as [friendly name 1],
"key2" as [friendly name 2]
FROM table_2 ) as table_2_aliasd
整个场景可能是这样的:
DROP TABLE IF EXISTS test;
-- this is your test table
CREATE TABLE test (
key01 INTEGER
, key02 INTEGER
, key03 INTEGER
, key04 INTEGER
, key05 INTEGER
, key06 INTEGER
, key07 INTEGER
, key08 INTEGER
, key09 INTEGER
, key10 INTEGER
)
;
CREATE TABLE mapname (
column_name VARCHAR(32)
, user_friendly_column_name VARCHAR(32)
);
-- this is your name mapping table ...
INSERT INTO mapname
SELECT 'key01' , 'friendly_name_01'
UNION ALL SELECT 'key02' , 'friendly_name_02'
UNION ALL SELECT 'key03' , 'friendly_name_03'
UNION ALL SELECT 'key04' , 'friendly_name_04'
UNION ALL SELECT 'key05' , 'friendly_name_05'
UNION ALL SELECT 'key06' , 'friendly_name_06'
UNION ALL SELECT 'key07' , 'friendly_name_07'
UNION ALL SELECT 'key08' , 'friendly_name_08'
UNION ALL SELECT 'key09' , 'friendly_name_09'
UNION ALL SELECT 'key10' , 'friendly_name_10'
;
SELECT
'SELECT sp_rename '
+''''+table_name+'.'+c.column_name+''''
+' '''+user_friendly_column_name+''''
+' ''COLUMN'';'
FROM information_schema.columns c
JOIN mapname m ON m.column_name=c.column_name
WHERE table_schema='dbo'
AND table_name='test'
;
--你会得到:
sp_rename 'test.key01' 'friendly_name_01' 'COLUMN';
sp_rename 'test.key02' 'friendly_name_02' 'COLUMN';
sp_rename 'test.key03' 'friendly_name_03' 'COLUMN';
sp_rename 'test.key04' 'friendly_name_04' 'COLUMN';
sp_rename 'test.key05' 'friendly_name_05' 'COLUMN';
sp_rename 'test.key06' 'friendly_name_06' 'COLUMN';
sp_rename 'test.key07' 'friendly_name_07' 'COLUMN';
sp_rename 'test.key08' 'friendly_name_08' 'COLUMN';
sp_rename 'test.key09' 'friendly_name_09' 'COLUMN';
sp_rename 'test.key10' 'friendly_name_10' 'COLUMN';
整个场景可能是这样的:
DROP TABLE IF EXISTS test;
-- this is your test table
CREATE TABLE test (
key01 INTEGER
, key02 INTEGER
, key03 INTEGER
, key04 INTEGER
, key05 INTEGER
, key06 INTEGER
, key07 INTEGER
, key08 INTEGER
, key09 INTEGER
, key10 INTEGER
)
;
CREATE TABLE mapname (
column_name VARCHAR(32)
, user_friendly_column_name VARCHAR(32)
);
-- this is your name mapping table ...
INSERT INTO mapname
SELECT 'key01' , 'friendly_name_01'
UNION ALL SELECT 'key02' , 'friendly_name_02'
UNION ALL SELECT 'key03' , 'friendly_name_03'
UNION ALL SELECT 'key04' , 'friendly_name_04'
UNION ALL SELECT 'key05' , 'friendly_name_05'
UNION ALL SELECT 'key06' , 'friendly_name_06'
UNION ALL SELECT 'key07' , 'friendly_name_07'
UNION ALL SELECT 'key08' , 'friendly_name_08'
UNION ALL SELECT 'key09' , 'friendly_name_09'
UNION ALL SELECT 'key10' , 'friendly_name_10'
;
SELECT
'SELECT sp_rename '
+''''+table_name+'.'+c.column_name+''''
+' '''+user_friendly_column_name+''''
+' ''COLUMN'';'
FROM information_schema.columns c
JOIN mapname m ON m.column_name=c.column_name
WHERE table_schema='dbo'
AND table_name='test'
;
--你会得到:
sp_rename 'test.key01' 'friendly_name_01' 'COLUMN';
sp_rename 'test.key02' 'friendly_name_02' 'COLUMN';
sp_rename 'test.key03' 'friendly_name_03' 'COLUMN';
sp_rename 'test.key04' 'friendly_name_04' 'COLUMN';
sp_rename 'test.key05' 'friendly_name_05' 'COLUMN';
sp_rename 'test.key06' 'friendly_name_06' 'COLUMN';
sp_rename 'test.key07' 'friendly_name_07' 'COLUMN';
sp_rename 'test.key08' 'friendly_name_08' 'COLUMN';
sp_rename 'test.key09' 'friendly_name_09' 'COLUMN';
sp_rename 'test.key10' 'friendly_name_10' 'COLUMN';
Manny,假设您尝试将列别名为查询的友好名称,而不是重命名物理列,那么您需要使用动态SQL来实现这一点 下面是一个可能帮助您开始的示例。由于不了解您的数据体系结构,我在下面自由了一些。但是,您应该能够根据需要修改此逻辑
/* CREATE A MOCK-UP LIST OF TABLE OBJECTS */
DECLARE @Tables TABLE ( TableNm VARCHAR(50) );
INSERT INTO @Tables VALUES ( 'Table1' ), ( 'Table2' ), ( 'Table3' );
/* CREATE A MOCK-UP OF FRIENDLY NAMES THAT TIE BACK TO THE TABLE OBJECTS */
DECLARE @FriendlyNames TABLE ( TableNm VARCHAR(50), ColumnNm VARCHAR(50), ColumnUserFriendlyName VARCHAR(50) );
INSERT INTO @FriendlyNames ( TableNm, ColumnNm, ColumnUserFriendlyName ) VALUES
( 'Table1', 'key1', 'Friendly Name 1' ), ( 'Table1', 'key2', 'Friendly Name 2' );
-- Create a parameter of the table name to query.
DECLARE @TableQry VARCHAR(50) = 'Table1';
-- Create a dynamic sql statement of column/aliases for the requested table.
DECLARE @dynamic_sql AS VARCHAR(MAX) = (
SELECT
FORMATMESSAGE ( 'SELECT %s FROM %s;', FriendlyNames.Aliases, tbls.TableNm ) AS Dsql
FROM @Tables AS tbls
OUTER APPLY (
SELECT
STRING_AGG ( FORMATMESSAGE ( '[%s] AS [%s]', fn.ColumnNm, fn.ColumnUserFriendlyName ), ',' ) AS Aliases
FROM @FriendlyNames AS fn
INNER JOIN @Tables AS tbls
ON fn.TableNm = tbls.TableNm
) AS FriendlyNames
WHERE
tbls.TableNm = @TableQry
);
-- Display the dynamic SQL created.
SELECT @dynamic_sql AS DynamicSql;
返回
+-----------------------------------------------------------------------------+
| DynamicSql |
+-----------------------------------------------------------------------------+
| SELECT [key1] AS [Friendly Name 1],[key2] AS [Friendly Name 2] FROM Table1; |
+-----------------------------------------------------------------------------+
不考虑您的SQL Server体验,要执行动态SQL,您可以执行以下操作:
-- Execute the dynamic sql.
EXEC ( @dynamic_sql );
您可以扩展友好名称表以包含列顺序和更多内容,但我再次对您的需求做出一些假设,因为不清楚您是否希望实际重命名一系列列,或者保留友好名称列表,以便稍后用于查询。Manny,假设您尝试将列别名为查询的友好名称,而不是重命名物理列,则需要使用动态SQL来实现此目的 下面是一个可能帮助您开始的示例。由于不了解您的数据体系结构,我在下面自由了一些。但是,您应该能够根据需要修改此逻辑
/* CREATE A MOCK-UP LIST OF TABLE OBJECTS */
DECLARE @Tables TABLE ( TableNm VARCHAR(50) );
INSERT INTO @Tables VALUES ( 'Table1' ), ( 'Table2' ), ( 'Table3' );
/* CREATE A MOCK-UP OF FRIENDLY NAMES THAT TIE BACK TO THE TABLE OBJECTS */
DECLARE @FriendlyNames TABLE ( TableNm VARCHAR(50), ColumnNm VARCHAR(50), ColumnUserFriendlyName VARCHAR(50) );
INSERT INTO @FriendlyNames ( TableNm, ColumnNm, ColumnUserFriendlyName ) VALUES
( 'Table1', 'key1', 'Friendly Name 1' ), ( 'Table1', 'key2', 'Friendly Name 2' );
-- Create a parameter of the table name to query.
DECLARE @TableQry VARCHAR(50) = 'Table1';
-- Create a dynamic sql statement of column/aliases for the requested table.
DECLARE @dynamic_sql AS VARCHAR(MAX) = (
SELECT
FORMATMESSAGE ( 'SELECT %s FROM %s;', FriendlyNames.Aliases, tbls.TableNm ) AS Dsql
FROM @Tables AS tbls
OUTER APPLY (
SELECT
STRING_AGG ( FORMATMESSAGE ( '[%s] AS [%s]', fn.ColumnNm, fn.ColumnUserFriendlyName ), ',' ) AS Aliases
FROM @FriendlyNames AS fn
INNER JOIN @Tables AS tbls
ON fn.TableNm = tbls.TableNm
) AS FriendlyNames
WHERE
tbls.TableNm = @TableQry
);
-- Display the dynamic SQL created.
SELECT @dynamic_sql AS DynamicSql;
返回
+-----------------------------------------------------------------------------+
| DynamicSql |
+-----------------------------------------------------------------------------+
| SELECT [key1] AS [Friendly Name 1],[key2] AS [Friendly Name 2] FROM Table1; |
+-----------------------------------------------------------------------------+
不考虑您的SQL Server体验,要执行动态SQL,您可以执行以下操作:
-- Execute the dynamic sql.
EXEC ( @dynamic_sql );
您可以扩展friendly names表以包括列顺序等,但我还是对您的需要做一些假设,因为不清楚您是否希望实际重命名一系列列,或者保留一个友好名称列表,以后可以用于查询。我需要自动创建-我有100个这样的列,我不想一个接一个地在列表中手动写入别名code@Manny除非您编写一些动态SQL,否则您必须逐个执行。@Manny如果您需要对所有列使用别名,那么,具有所有别名的视图是更好的解决方案。根据需要,仅从视图中选择需要的对象。“一次完成比一个查询一个查询要好得多”。@Adrian J.Moreno我在回答中也建议这样做。@VV4D澄清了我的评论,只是备份你。我需要自动-我有100个这样的列,我不想一个接一个地手动在code@Manny除非您编写一些动态SQL,否则您必须逐个执行。@Manny如果您需要对所有列使用别名,那么使用所有别名的视图是更好的解决方案。根据需要,仅从视图中选择需要的对象。“一次完成比一个查询一个查询更好。@阿德里安J.莫雷诺我在回答中也提出了这个建议。@VV4D澄清了我的评论,只是支持你。