情况: 3个源表:
1. 用户(包含唯一 ID 和用户特定属性,如firstName
、givenName
、StreetAddress
等)
2. MigrationFeatures(包含唯一 ID 和Feature_Name
)
3. Link_Users_and_Features(包含来自Users
和的唯一 IDFeatures
以及Status
列 (int) )
在链接表中,每个用户的行数与Feature
表中的行数完全相同,并且这些行中的每一行(每个用户)都链接到一个Feature
。每个链接行还包含一个状态值列,该列可以具有不同的值 - 根据Feature
特定用户的特定迁移状态。
目标:
拥有一个完全动态的查询/SP,它为每个用户返回一行,其中包含Feature
该特定用户的每个用户的迁移状态 - 每个迁移状态列都应根据表Feature_Name
中对应的Feature
from命名Features
。Feature
当我在表中添加一个附加项时Feature
,不必手动修改所需的查询代码。
提示:该Feature
表已经有一个插入触发器,它为每个用户创建这个附加列,并且相关列上存在引用完整性,因此所有用户将始终在链接表中拥有所有对应的行Features
。
为什么我想要那个:
到目前为止,我只有一个表,其中包含所有用户特定的列 ( Name, givenName, StreetAddress,
etc) 以及所有迁移功能状态列 ( SIDhist migrated, homefolder migrated,
etc),其中包含所有用户的所有迁移状态数据。
不幸的是,这是完全静态的,每当我添加一个新的时Feature
,我都必须修改这个主表。未来,不太熟练的人将使用底层系统,他们不会进入数据库代码或模式,而只会向表Feature
和user
表中添加记录。
这里是创建用户数据库的代码:
CREATE TABLE [dbo].[Users](
[Users_ID] [int] IDENTITY(1,1) NOT NULL,
[FMOUser_givenName] [nvarchar](max) NULL,
[FMOUser_sn] [nvarchar](max) NULL,
[FMOUser_streetAddress] [nvarchar](max) NULL,
[ExcludeFromMigration] [bit] NULL,
CONSTRAINT [PK_Users] PRIMARY KEY CLUSTERED
(
[Users_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
这里是创建特征表的代码:
CREATE TABLE [dbo].[Features](
[Features_ID] [int] IDENTITY(1,1) NOT NULL,
[Feature_Name] [nvarchar](max) NOT NULL
CONSTRAINT [PK_Features] PRIMARY KEY CLUSTERED
(
[Features_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO
创建链接表的代码:
CREATE TABLE [dbo].[link_Users__with__Features](
[link_Users__with__Features_ID] [int] IDENTITY(1,1) NOT NULL,
[FMO_Users_ID] [int] NOT NULL,
[Features_Migration_Core_ID] [int] NOT NULL,
[StatusValue] [int] NOT NULL,
[Description] [nvarchar](max) NULL,
CONSTRAINT [PK_link_Users__with__Features] PRIMARY KEY CLUSTERED
(
[link_Users__with__Features_ID] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
我已经研究了什么?
我找到了以下示例:
http://www.dbforums.com/microsoft-sql-server/1673127-view-multiple-records-single-row.html
这确实将多行中的单列放在新列名下的单行中,但它不是动态的 - 意味着:它不会从Features
表中相应的“Feature”行中提取目标列名,也不能处理动态的数量Features
。
由于我对 T-SQL 比较陌生,我不知道如何解决这个挑战。
由于这是我在堆栈溢出的第一个问题,如果我错过了形式,请原谅我。请纠正我,我会做得更好:-)
提示:我已经查找了针对我的问题提出的“重复”,但似乎没有一个与我的问题稍有匹配。