我有一个表变量,称为@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
字段。我打算将转置表连接到该字段上的另一个表。
为了说明不同模型的不同记录数,我使用字符串连接构造了数据透视语句:
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
我得到所有模型的空值,我在 sqlfiddle 上构建了这个枢轴的玩具示例,它按预期工作。我不确定我做错了什么。
如何在不获取空值的情况下转置此表?