2015-06-03 53 views
1

我有包含尾随散列符号的表:的SQL Server删除尾随字符

SELECT * Table 

Id DisplayName_55270A70 OSVersion_66DD9B43 
1 NURAPP001   Windows Server 2008 

的表模式似乎是产生这个架构工具的每个安装独一无二的。我想创建一个查询,而不诉诸存储过程,会产生不列哈希符号:

Id DisplayName   OSVersion 
1 NURAPP001   Windows Server 2008 

我能产品以逗号分隔的用下面的查询列的清单,但我不知道有足够的了解SQL服务器将其转换成可执行查询:

SELECT REPLACE(
(SELECT COLUMN_NAME AS 'data()' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='MTV_OperatingSystem' 
ORDER BY ORDINAL_POSITION 
FOR XML PATH('')) 
,' ',', ') 

信贷由于:在不改变现有的模式http://www.sql-ex.com/help/select20.php

+0

是否有任何列在其名称中有下划线(除了在散列开始处)? – Synergist

+0

如果尾部字符总是以下划线('_')开头,那么只要列名中没有要保留的下划线,就可以。您可能需要'INFORMATION_SCHEMA.COLUMNS'系统视图。 – HoneyBadger

+0

是的,表中的所有列遵循相同的约定。哈希结束。 –

回答

1

您可以创建和EXECUTE执行查询,像这样:

DECLARE @cols NVARCHAR(MAX) 
SET @cols = REPLACE(
(SELECT COLUMN_NAME AS 'data()' 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME='BankAcctInfo' 
ORDER BY ORDINAL_POSITION 
FOR XML PATH('')) 
,' ',', ') 

DECLARE @EXEC NVARCHAR(MAX) 
SET @EXEC = 'SELECT ' + @cols + ' FROM YOURTABLENAME' 

EXEC(@EXEC) 
+0

谢谢你,@ thepirat000。不幸的是,查询是通过JDBC调用的,所以我不能定义本地变量并执行存储过程。 –

1

;而是采用*如果你指定的列名明确指定为列table alias

select Id, 
DisplayName_55270A70 as DisplayName, 
OSVersion_66DD9B43 as OSVersion 
from mytable; 

如果您想不会再输入一次,考虑与创建view(存储查询)像

create view myview 
as 
select Id, 
DisplayName_55270A70 as DisplayName, 
OSVersion_66DD9B43 as OSVersion 
from mytable; 

然后下次运行,你可以做一个select * from myview

+0

Rahul,正如我所提到的,此表的模式因实例而异。举例说明: Rahul,正如我所提到的,该表的模式因实例而异。为了说明: 实例1: 标识DisplayName_55270A70 OSVersion_66DD9B43 实例2: 标识DisplayName_55270BBB OSVersion_66DD9CCC 如果我知道时间提前列名,我只想用别名直接在查询SELECT DisplayName_55270BBB AS显示名称。 –

+0

这是一件奇怪的事情。在这种情况下,您将不得不从“INFORMATION_SCHEMA”进行查询并相应地修改列名称(或)创建具有修改列名称的辅助表。 – Rahul

+0

是的,这是一款名为System Center Operations Manager的微软产品。 MTV_OperatingSystem和其他视图都是这样设计的。 –