SQL查询创建多个记录的单个记录视图 - 动态存储过程?

时间:2013-06-18 00:57:16

标签: sql arrays sql-server-2008 stored-procedures

好吧,我认为必须有一种更简单的方法来做到这一点,我想动态地做,而不是手写每一行。我对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中编写它?

1 个答案:

答案 0 :(得分:1)

您将在SQL Server中使用XML_PATH。 GROUP_CONCAT的解决方法

SELECT
    U.UID,
    U.EMAIL,
    stuff(
    (
    select cast(',' as varchar(max)) + name + '=' + Value
    from USER_META
    WHERE UID = U.UID
    for xml path('')
    ), 1, 1, '') AS M
FROM
    USERS U

SQL Fiddle