追加" _重复"到不明确的列名称

时间:2016-06-09 14:50:18

标签: sql sql-server tsql

我有一个查询将表连接回自身,以显示在某个窗口内生成重复的订单。

该表返回如下内容:

id    |  value  |  note  |  id   |  value  |  note
------------------------------------------------------
01    |  abcde  |  ....  |  03   |  zyxxx  |  ....
06    |  12345  |  ....  |  09   |  54321  |  ....

实际上,该表返回超过150列,因此当连接发生时,我最终得到300列。我最终必须手动将150列重命名为" id_Repeat"," value_Repeat"," note_Repeat"等...

我正在寻找一种自动附加的方式" _Repeat"到了含糊不清的专栏。这可能在T-SQL中使用(使用SQL Server 2008),还是我必须使用以下方法手动映射每列:

SELECT [value] AS [value_Repeat]

2 个答案:

答案 0 :(得分:0)

这在T-SQL中是不可能的。列将具有其源表中的名称或您指定的任何别名,但无法系统地重命名它们。

对于这样的情况,将它提高一级是值得的:编写一些代码(使用sys.columns)生成您之后的查询,包括重命名。当您有计算机供您使用时,为什么要为150列手动执行某些操作?

答案 1 :(得分:0)

我能看到这个工作的唯一方法就是构造一些动态SQL(呃!)。我汇总了一个如何运作的快速示例:

CREATE TABLE test1 (id INT, note VARCHAR(50));
CREATE TABLE test2 (id INT, note VARCHAR(20));
INSERT INTO test1 SELECT 1, 'hello';
INSERT INTO test2 SELECT 1, 'world';
DECLARE @SQL VARCHAR(4096);
SELECT @SQL = 'SELECT ';
SELECT @SQL = @SQL + t.name + '.' + c.name + CASE WHEN t.name LIKE '%test2%' THEN ' AS ' + c.name + '_repeat' ELSE '' END + ','
FROM sys.columns c INNER JOIN sys.tables t ON t.object_id = c.object_id WHERE t.name IN ('test1', 'test2');
SELECT @SQL = LEFT(@SQL, LEN(@SQL) - 1);
SELECT @SQL = @SQL + ' FROM test1 INNER JOIN test2 ON test1.id = test2.id;';
EXEC(@SQL);
SELECT @SQL;
DROP TABLE test1;
DROP TABLE test2;

输出是:

id  note    id_repeat   note_repeat
1   hello   1           world