我有一个名为@t
的表变量,它是我在此定义的specsAndModel类型的一个实例:
CREATE TYPE specsAndModel AS TABLE
(
specName VARCHAR(50)
,specVal VARCHAR(50)
)
执行select specName,specVal from @t
会提供以下格式的数据:
specName | specVal
--------------------------------
[modelNumber] | F00-B4R
[Internal Switch(es)] | 2.00000
[Number of Ports] | 1.00000
[Color Insulator] | Yellow
我插入了第一行,这样当我转置表时,会有一个modelNumber
字段。我打算将转置表加入该字段中的另一个表。
为了考虑不同模型的不同数量的记录,我使用字符串连接构建了pivot语句:
DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
SELECT @cols = COALESCE(@cols + ',' + specName, specName) FROM @t;
SET @query = N'SELECT ' + @cols
+ N' FROM @var src'
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';
查询字符串如下所示:
SELECT [modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator]
FROM @var src
PIVOT
(
MAX(specVal)
FOR specName in ([modelNumber],[Internal Switch(es)],[Number of Ports],[Color Insulator])
) pvt;
最后,我使用sp_executesql
传递@t
变量,然后执行@query
字符串:
EXEC sp_executesql @query, N'@var specsAndModel readonly', @t
结果如下:
[modelNumber] | [Internal Switch(es)] | [Number of Ports] | [Color Insulator]
-----------------------------------------------------------------------------
NULL | NULL | NULL | NULL
我得到了所有模型的空值,我构建了一个这个视角here on sqlfiddle的玩具示例,它按预期工作。我不确定我做错了什么。
如何在不获取空值的情况下转置此表?
答案 0 :(得分:4)
要解决的一些问题:
首先,移除[
声明中specName
值周围的INSERT
。
其次,改变你的列的方式。这会在[
值周围添加specName
:
DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName)
from @t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
如果你这样做,那么你的脚本将起作用:
DECLARE @cols NVARCHAR(MAX);
DECLARE @query NVARCHAR(MAX);
select @cols = STUFF((SELECT distinct ',' + QUOTENAME(specName)
from @t
FOR XML PATH(''), TYPE
).value('.', 'NVARCHAR(MAX)')
,1,1,'')
SET @query = N'SELECT ' + @cols
+ N' FROM @var src'
+ N' PIVOT (MAX(specVal) FOR specName in (' + @cols + N')) pvt;';
EXEC sp_executesql @query, N'@var specsAndModel readonly', @t