1

我想将多个表中的数据存储到一个表中

table A (
p, q,
PRIMARY KEY (p,q)
)

table B (
p, m, n,
PRIMARY KEY (p,m,n)
)

table output(
p,
xml
)

输出应该像

对于表 A

 -------------------------------
|    p      |        xml        |
---------------------------------
|value of p | <q>some value</q> |
 -------------------------------

对于表 B

 -----------------------------------------------
|    p      |        xml                        |
------------------------------------------------
|value of p | <m>some value</m><n>some data</n> |
 -----------------------------------------------

这可以通过这个查询来实现

SELECT * 
FROM Students s
CROSS APPLY
(
    SELECT 
        (
            SELECT * 
            FROM Students t
            WHERE t.DisplayName = s.DisplayName
            FOR XML RAW
        ) x1
)x

但我想让 SQL 足够通用,以便给定任何表名,我们可以获得上述输出。

内部连接的问题是查询不会是通用的

4

2 回答 2

1

要从一个表中获得您想要的结果,您可以使用以下内容:

select T.Table1ID,
       (
         select T.*
         for xml raw, type
       ) as x1
from Table1 as T

要将相同的模式应用于另一个表,您需要更改表名和键列的字段名。

select T.Table2ID,
       (
         select T.*
         for xml raw, type
       ) as x1
from Table2 as T

如果您想要更通用的版本,您可以使用动态 SQL 并根据表名和列名构建查询。

declare @TableName sysname 
declare @KeyColumnName sysname

set @TableName = 'master..spt_values'
set @KeyColumnName = 'Number'

declare @SQL nvarchar(500)

set @SQL = '
select '+@KeyColumnName+',
       (
         select T.*
         for xml raw, type
       ) as x1
from '+@TableName+' as T'

exec (@SQL)
于 2013-01-10T06:32:45.197 回答
0

如果我误解了,我很抱歉,但这或多或少是你所追求的原则吗?

;WITH Base AS
(
    SELECT   Cat    = PC.Name
            ,SubCat = SC.Name
    FROM Production.ProductCategory     PC
    JOIN Production.ProductSubcategory  SC  ON SC.ProductCategoryID = PC.ProductCategoryID
)
SELECT Cat, (SELECT SubCat FROM Base T2 WHERE T2.Cat = T1.Cat FOR XML AUTO )DT
FROM Base T1
于 2013-01-10T06:03:14.267 回答