我创建了一个动态SQL查询,它连接了几个表,然后关闭一个名为Geometries的表来存储名称/值对。 SQL是动态的,因为在运行时我不知道需要转移哪些名称/值对。
下面的查询获取了我需要的数据,但是,所有的几何列都列出了两次,就像我从同一数据中旋转了两次一样。我无法弄清楚为什么会这样。我怀疑这与我在公共表表达式中选择名称/值对的事实有关,该表达式选择下面代码示例第13行的几何名称/值列:g.Name[Geometry], g.Value
也许将它与底部附近的PIVOT代码耦合会导致查询结果中的重复列数据?
我无法删除第13行的代码,或者PIVOT失败并显示错误,指出几何和值不是有效的列名。
无论如何,这是查询...
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(g.Name)
FROM Geometries g
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query =
'SELECT *, ' + @cols + '
FROM (
SELECT
r.Id[RunId], rd.Id[RunDataId], r.RunNumber [Run #], r.TestNumber [Test #], r.Description,
rd.data1, rd.data2, rd.data3,
g.Name[Geometry], g.Value
FROM dbo.Runs r
INNER JOIN RunDatas rd ON r.Id = rd.RunId
INNER JOIN RunGeometries rg ON rg.RunId = r.Id
INNER JOIN Geometries g ON g.Id = rg.GeometryId
) as data
PIVOT
(
Max(Value) FOR Geometry IN (' + @cols + ')
) as p'
execute sp_executesql @query
任何有助于确定导致重复数据的原因都将受到赞赏。
答案 0 :(得分:1)
select *
包含您要转动的列;试试这个:
DECLARE @cols AS NVARCHAR(MAX), @query AS NVARCHAR(MAX)
SELECT @cols = STUFF((SELECT distinct ',' + QUOTENAME(g.Name)
FROM Geometries g
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query =
'SELECT [RunId], [RunDataId], [Run #], [Test #], Description, data1, data2, data3, ' + @cols + '
FROM (
SELECT
r.Id as [RunId], rd.Id as [RunDataId], r.RunNumber as [Run #], r.TestNumber as [Test #], r.Description,
rd.data1, rd.data2, rd.data3,
g.Name[Geometry], g.Value
FROM dbo.Runs r
INNER JOIN RunDatas rd ON r.Id = rd.RunId
INNER JOIN RunGeometries rg ON rg.RunId = r.Id
INNER JOIN Geometries g ON g.Id = rg.GeometryId
) as data
PIVOT
(
Max(Value) FOR Geometry IN (' + @cols + ')
) as p'
print @query -- you can also take a look at the code you are generating to help troublshoot
execute sp_executesql @query
您还可以查看使用print @query
或select @query
生成的代码。