有没有办法删除' _'在sql语句中选择*时从列名?

时间:2014-07-21 14:04:35

标签: sql sql-server

我的表中包含所有列名 (有超过80列,我现在无法更改列名)  格式为' _'。像First_Name,Last_Name,...

所以我想改用select * from table 使用AS。

我想通过删除' _'来选择它们。在一个声明中。无论如何我能做到吗? 在select语句中有Replace(coulmnName, '_','')之类的东西吗?

由于

3 个答案:

答案 0 :(得分:5)

您只需重命名查询中的列即可。例如:

SELECT FIRST_NAME [First Name],
       LAST_NAME [Last Name]
  FROM UserTable

您也可以使用AS关键字,但这是可选的。另请注意,如果您不想在每个查询上执行此操作,则可以使用此过程创建具有重命名列的视图。然后,您可以按照您希望的方式使用SELECT *(尽管出于多种原因,这被视为bad idea)。

祝你好运!

替代方案 - 在客户代码中映射:

另一种选择是在客户端代码中进行映射。该解决方案将在很大程度上取决于您的ORM。大多数ORM(例如LINQ或EF)将允许您重新映射。如果没有别的,您可以使用AutoMapper或类似方法使用基于约定的命名重命名客户端上的列。

答案 1 :(得分:1)

除非您使用动态SQL,否则无法在单个语句中执行此操作。如果您只是尝试生成代码,则可以针对Information_Schema运行查询并获取所需的信息...

DECLARE @MaxColumns INT
DECLARE @TableName VARCHAR(20)
SET @TableName = 'Course'
SELECT @MaxColumns = MAX(ORDINAL_POSITION) FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = @TableName 


SELECT Col 
FROM 
  (
    SELECT 0 Num, 'SELECT' Col
    UNION
    SELECT ROW_NUMBER() OVER (PARTITION BY TABLE_NAME ORDER BY ORDINAL_POSITION) Num, ' [' + COLUMN_NAME + '] AS [' + REPLACE(COLUMN_NAME, '_', '') + ']' + CASE WHEN ORDINAL_POSITION = @MaxColumns THEN '' ELSE ',' END
    FROM INFORMATION_SCHEMA.COLUMNS 
    WHERE TABLE_NAME = @TableName
    UNION 
    SELECT @MaxColumns + 1 Num, 'FROM ' + @TableName 
  ) s 
ORDER BY num 

答案 2 :(得分:0)

这个问题引起了我的兴趣,我确实找到了一种方法。它实现了它,但如果你只是想在一个查询中给出很多别名,我就不会推荐它。

首先,我创建了一个存储过程,它提取了所有列名,并为它们提供了一个没有'_'的别名。

USE [DataBase]
GO
IF OBJECT_ID('usp_AlterColumnDisplayName', 'P') IS NOT NULL
    DROP PROCEDURE usp_AlterColumnDisplayName
GO

CREATE PROCEDURE usp_AlterColumnDisplayName 
@TableName VARCHAR(50)
,
@ret nvarchar(MAX) OUTPUT
AS

Select @ret = @ret + [Column name]
From
(
    SELECT ([name] + ' AS ' + '[' + REPLACE([name], '_', ' ') + '], ') [Column name]
    FROM syscolumns
    WHERE id =
        (Select id
        From sysobjects
        Where type = 'U'
        And [name] = @TableName
    )
) T
GO

然后提取该字符串并将其抛入另一个带有查询结构的字符串中。

执行该操作即可完成。

DECLARE @out NVARCHAR(MAX), @DesiredTable VARCHAR(50), @Query NVARCHAR(MAX)
SET @out = ''
SET @DesiredTable = 'YourTable'
EXEC usp_AlterColumnDisplayName 
    @TableName = @DesiredTable,
    @ret = @out OUTPUT
SET @out = LEFT(@out, LEN(@out)-1) --Removing trailing ', '

SET @Query = 'Select ' + @out + ' From ' + @DesiredTable + ' WHERE whatever'

EXEC sp_executesql @Query

如果您只想一次性地提供大量别名,而不是坐着并输入80多列,我宁愿建议使用一个简单的SELECT语句,如sp中的那个,或者Excel然后将粘贴复制到您的代码中。