在每个列名前加上一个特定的字符串

本文关键字:上一个 字符串 | 更新日期: 2023-09-27 18:14:03

我正试图手动将一些行映射到其适当类的实例。我知道我需要使用每个表的每个列,并将所有这些列从一个表映射到给定的类。

然而,我想知道是否有更简单的方法来做到这一点。现在,我有一个叫School的类和一个叫User的类。这些类中的每一个都有一个Name属性和其他属性(但是' Name '是重要的,因为它是两个类的共同名称)。

现在,我正在做下面的事情来映射它们。

SELECT u.SomeOtherColumn, u.Name AS userName, s.SomeOtherColumn, s.Name AS schoolName FROM User AS u INNER JOIN School AS s ON something

我很想做下面的事情,但是我不能,因为Name是类之间的共同名称。

SELECT u.*, s.* FROM User AS u INNER JOIN School AS s ON something

但是这会产生一个错误,因为它们都有Name列。我能给它们加上前缀吗?比如这个?

u.user_*, s.school_*

那么这些表的每一列都有一个前缀?例如user_Nameschool_Name ?

在每个列名前加上一个特定的字符串

几年前,我写了一堆函数和过程来帮助我开发使用动态SQL的SQL服务器和应用程序的自动代码生成例程。以下是我认为对你的情况最有帮助的一条:

Create FUNCTION [dbo].[ColumnString2]
(
    @TableName  As SYSNAME,       --table or view whose column names you want
    @Template   As NVarchar(MAX), --replaces '{c}' with the name for every column,
    @Between    As NVarchar(MAX)  --puts this string between every column string
)   
    RETURNS NVarchar(MAX) AS
BEGIN
    DECLARE @str As NVarchar(MAX);
    SELECT  TOP 999
        @str = COALESCE(
                @str + @Between + REPLACE(@Template,N'{c}',COLUMN_NAME), 
                REPLACE(@Template,N'{c}',COLUMN_NAME)
                        )
    FROM    INFORMATION_SCHEMA.COLUMNS
    WHERE   TABLE_SCHEMA= COALESCE(PARSENAME(@TableName, 2), N'dbo')
      And   TABLE_NAME  = PARSENAME(@TableName, 1)
    ORDER BY ORDINAL_POSITION
    RETURN @str;
END

这允许您以任何您想要的方式格式化表或视图的所有列名。只需向它传递一个表名,以及一个带有'{c}'的模板字符串,您希望为每个列插入列名。它将对@TableName中的每个列执行此操作,并在它们之间添加@Between字符串。

下面是一个如何垂直格式化一个表的所有列名的示例,使用前缀重命名它们,以适合包含在SELECT查询中的方式:

SELECT dbo.[ColumnString2](N'yourTable', N'
    {c} As prefix_{c}', N',')

这个函数是为动态SQL设计的,但是您也可以在Management Studio中执行它,并将输出设置为Text(而不是Grid)。然后将输出剪切并粘贴到所需的查询、视图或代码文本中。(一定要更改文本结果的SSMS查询选项,将"显示的最大字符数"从256提高到最大(8000)。如果仍然截断,则可以将此过程更改为一个函数,将每个列作为单独的行输出,而不是作为单个大字符串输出。