好的,我认为必须有一种更简单的方法来做到这一点,我想动态地做,而不是手写每一行。我对 MySQL 比对 SQL Server 2008 更熟悉,但我也不确定如何在 MySQL 中做到这一点。
我有 3 张桌子。
Table 1: USER id | email | password
Table 2: METADATA id | name (list of fields I need to know about user)
Table 3: USER_META id | uid | name | value (where I store the user meta data)
我没有对 METADATA 进行硬编码,因为它会针对此应用程序的每个实例进行更改。但在这个例子中,假设元数据是“眼睛”、“电话”、“城市”(实际上还有很多,本周可能有 20 个,下周可能有 40 个)
所以它的工作方式是当用户注册时,我使用 METADATA 表构建注册表单来构建表单。它创建了一个带有“眼睛”、“电话”和“城市”的表格。
当我保存表单时,我将单个记录保存到USER_META
每个数据项的表中。因此,在注册时,我得到 3 个插入:
insert into USER_META(uid,name,value) values (5,"eyes","brown")
insert into USER_META(uid,name,value) values (5,"phone","555-1212")
insert into USER_META(uid,name,value) values (5,"city","San Francisco")
现在,我想编写一个存储过程,它将返回这样的记录“
EXECUTE Get_Meta 5
返回:
uid | email | eyes | phone | city
5 x@x.com brown 555-1212 San Francisco;
我可以编写一个长的硬编码选择语句,例如:
DECLARE @UID int;
SELECT id, email,
(select value from USER_META
where uid = @UID and name = 'EYES') as EYES,
(select value from USER_META
where uid = @UID and name = 'PHONE') as PHONE,
(select value from USER_META
where uid = @UID and name = 'CITY') as CITY,
FROM USER
where id = @UID;
但是这种方式违背了整个目的,每当元数据需求发生变化时(例如,当我们启动另一个实例时),我必须每周重新编写它。
我想要这样的东西:(请原谅我对高级 SQL 不是很有经验,所以也许这很简单,我只是不知道该怎么做?)我会用基本的代码术语编写它来尝试和解释我的想法:
DECLARE @UID int;
DECLARE @META_NAMES array;
@META_NAMES = (select NAME from METADATA);
SELECT id, email,
for each (@META_NAMES as $THIS_NAME) {
(select value from USER_META
where uid = @UID and name = '$THIS_NAME') as $THIS_NAME,
}
FROM USER
where id = @UID;
有没有办法在 SQL Server 2008 中编写它?