在SQL Server 2008中我有一个情况我需要返回动态生成的表和列也动态生成。

被查询生成在这一切,我开始用一个ID,然后我得到的列名和类型,这就是为什么铸造。

以下是最终的查询,将返回我想要的表,在一种情况下,但这种类似的查询可用于返回多个表。

这是目前在C#中实现的,但我希望它应该是在一个存储过程或函数是可行的,但是,我不能肯定我怎样才能使多个查询建立此查询,到然后返回表。

感谢您。

SELECT ResultID, ResultName, ResultDescription, 
CAST([233] AS Real) as [ResultColA], 
CAST([234] AS Int) as [ResultColB], 
CAST([236] AS NVarChar) as [ResultColC], 
CAST([237] AS Int) as [ResultColD]
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ([233], [234], [236], [237])) as pvt

更新:如果我有了汽车制造商的表,我想通用制造的汽车的所有属性。我抬头对汽车的信息,用它来获得汽车的所有制造商,这将是通用汽车,那么我想通用汽车所做的所有汽车信息,但是,由于信息已被动态生成的列是不同的。   这是我在的地方,需要动态地生成此表。我很好奇,如果我可以或许只是招呼一下web服务,让动态生成的查询,然后有存储过程或函数执行该查询。

更新2:下一步后,我得到这个表是我需要添加了所有的选项上车(在这种情况下),以确定汽车的实际价格。这就是为什么它需要以表格格式。在这一点上我在看由通用汽车制造的汽车,但我可以做的SEARAY做船另一个查询,查询应该工作,即使艇上表中的列是不同的比汽车是一样的。

有帮助吗?

解决方案

您可以使用动态SQL做到这一点。你需要有一个查询和/或元数据适当地建立自己的两个列表,然后将它们插入SQL:

DECLARE @template AS varchar(MAX)

SET @template = '
SELECT ResultID, ResultName, ResultDescription
{@SELECT_COLUMN_LIST}
FROM (
    SELECT st.*, avt.ResultID as avtID, avt.SomeAttrID, avt.Value 
    FROM Result_AV avt 
    JOIN Result st ON avt.ResultID = st.ResultID) as p 
    PIVOT ( 
        MAX(Value) FOR AttributeID IN ({@PIVOT_COLUMN_LIST})) as pvt'

DECLARE @sql AS varchar(MAX)

SET @sql = REPLACE(REPLACE(@template, '{@SELECT_COLUMN_LIST}', @SELECT_COLUMN_LIST), '{@PIVOT_COLUMN_LIST}', @PIVOT_COLUMN_LIST)

EXEC (@sql)

要填充@SELECT_COLUMN_LIST@PIVOT_COLUMN_LIST,你有几种选择,但像这样避免了需要一个光标或尴尬的字符串操作:

SELECT @PIVOT_COLUMN_LIST = COALESCE(@PIVOT_COLUMN_LIST, '') + ',' + QUOTENAME(value)
FROM (SELECT DISTINCT value FROM table)

显然,对于@SELECT_COLUMN_LIST你需要这些信息与一些元数据结合起来。

我已经做了这样的事情,易于维护的,因为PIVOT和UNPIVOT不允许名单是动态的SQL(因为它们导致在输出表架构更改)。对于其中列没有解释客户端报表样式或列表框的使用,也无所谓。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top