2009-04-18 66 views
0

我正在写报告以返回有关数据库中对象('文件')的详细信息。我的应用程序允许用户创建自己的标志以用于文件对象。标志基本上由一个名称组成,然后标志实例存储一个位值以指示它是否为父文件对象设置。SQL的问题..我如何动态添加列到SQL查询结果集?

我想编写一个查询,每个文件在数据库中返回一行,其中结果集中的前几列包含文件详细信息(id,name,size等),其余列是标志名称,并返回位值,以指示是否为给定文件行设置标志。

这有道理吗?我如何着手编写查询?

感谢您的任何帮助。

编辑:澄清..

由于此查询的一部分,我需要运行一个子查询,返回已经由用户创建的标志(我不知道这些在设计时),然后合并检查主查询中的每个标志值以返回有关文件的详细信息。

了简化的架构如下:

  • 文件{ID,名称}
  • 标志{ID,名称}
  • FileFlags {FILEID,FlagId} - 在这个表中的行指示标志设置文件

我需要查询返回的列是这样的一个结果集:

FILEID文件名Flag1NameFlag2Name .... FlagNName

回答

1

您可以从查看SQL Server 2005+中可用的Pivot函数开始。与一些字符串连接,你应该能够组装一查询基于您的评论的任何数量的列

你的选择会是这个样子:

 SELECT <non-pivoted column>, 

      [first pivoted column] AS <column name>, 

      [second pivoted column] AS <column name>, ... 
    From Table 
    PIVOT (
... 
FOR 
... 
) 
-1

我想你想要的是一个别名。下面是从http://www.sql-tutorial.net/SQL-Aliases.asp

SELECT Employee, SUM(Hours) AS SumHoursPerEmployee 
FROM EmployeeHours 
GROUP BY Employee 

一个例子,我真的要看看你的模式,以进一步帮助。可能需要嵌套SELECT s。 http://sqlzoo.net/1a.htm

+0

没有遗憾,那不是什么即时通讯之后。我需要一个动态查询,其中子查询的结果构成主要查询的一部分。我没有看到什么别名与它有关... – MalcomTucker 2009-04-18 13:44:34

0

听起来或许你需要一个交叉表查询,你想把行转换为列。这些标志是否作为与父表的一对多关系存储在单独的表中?

+0

是的,他们被存储为1-M在单独的表 – MalcomTucker 2009-04-18 13:49:52

+0

我认为你想要做一个连接也许,而不是一个子查询,然后使用交叉表报告进程转换行到列。 这个问题可能会发生,因为每个你想要的行都可能有不同的列,因为每个列都有不同的标志,所以不知道如何将它们作为唯一的列返回到所有行中。 – schooner 2009-04-18 13:54:59

+0

你对不同列的潜在问题是正确的,但即时通讯非常高兴将所有标志作为列返回,然后只是表明它们是否设置,如果这是有道理的......我的SQL技能不是很高: – MalcomTucker 2009-04-18 14:02:33

1

为什么不创建与存储过程所需的逻辑 - 查询用户特定的标志等 - 并在此基础上动态构建一个包含所需变量的查询字符串?您可以使用EXECUTE将动态查询集返回给用户。见http://msdn.microsoft.com/en-us/library/ms188332.aspx