sql问题..如何动态添加列到SQL查询结果集?

时间:2009-04-18 13:38:00

标签: sql tsql dynamic-sql

我正在编写一份报告,以便在我的数据库中返回有关对象('files')的详细信息。我的应用程序允许用户创建自己的标志以用于文件对象。标志基本上由一个名称组成,然后标志实例存储一个位值,以指示它是否为父文件对象设置。

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

这有意义吗?我该如何编写查询?

感谢您的帮助。

编辑:澄清..

作为此查询的一部分,我需要运行一个子查询,该子查询返回用户创建的标志(我在设计时不知道这些标志),然后在主查询中包含对每个标志值的检查返回有关文件的详细信息。

简化架构如下:

  • 文件{Id,Name}
  • 国旗{Id,Name}
  • FileFlags {FileId,FlagId} - 此表中的一行表示为文件设置了标志

我需要查询返回包含以下列的结果集:

FileId FileName Flag1Name Flag2Name .... FlagNName

4 个答案:

答案 0 :(得分: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 :(得分:1)

为什么不使用所需的逻辑创建存储过程 - 查询用户特定的标志等 - 并在此基础上动态地使用您需要的变量构建查询字符串?

然后,您可以使用EXECUTE将动态查询集返回给用户。见http://msdn.microsoft.com/en-us/library/ms188332.aspx

答案 2 :(得分:0)

听起来好像您需要一个交叉表查询,您希望将行转换为列。标志是否作为与父表的一对多关系存储在单独的表中?

答案 3 :(得分:-1)

我认为你想要的是别名。以下是http://www.sql-tutorial.net/SQL-Aliases.asp

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

我真的必须看到你的架构有助于进一步发展。

修改 也许你需要嵌套的SELECThttp://sqlzoo.net/1a.htm