我正在尝试手动将某些行映射到其相应类的实例。我知道我需要使用每个表的每一列,并将所有这些列从一个表映射到给定的类。
然而,我想知道是否会有更简单的方法来做到这一点。现在,我有一个名为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_Name
和school_Name
?
答案 0 :(得分:1)
多年前,我编写了许多函数和过程来帮助我使用动态SQL为SQL Server和应用程序开发自动代码生成例程。以下是我认为对您的情况最有帮助的一个:
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)。如果仍然为您切断,那么您可以将此过程更改为一个函数,该函数将每列输出为单独的行,而不是单个大字符串。)