Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 从另一个表定义列名_Sql_Sql Server - Fatal编程技术网

Sql 从另一个表定义列名

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”和“友好

我有两张桌子

表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澄清了我的评论,只是支持你。