在SQL Server中,动态PIVOT列名上有空格。

问题描述 投票:0回答:1

我在SQL Server中有下一部分代码。

SET @cols = STUFF((
                    SELECT DISTINCT
                            ','+QUOTENAME([c].[Name])
                    FROM #features c FOR XML PATH(''), TYPE
                 ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

SET @query = 'SELECT [Id], 
                     [Url], 
                     [Title], 
                     [Address], 
                     [Domain], 
                     [Price], 
                     [Code],
                     [Image]
                     ' + @cols + '
               FROM (SELECT [Id], 
                            [Url], 
                            [Title], 
                            [Address], 
                            [Domain], 
                            [Price], 
                            [Code],
                            [Image], 
                            [Value] AS [value], 
                            [Name] AS [name] 
                     FROM #temptable) x 
                     PIVOT(max(value) for name in (' + @cols + ')) p';

它将返回我的行数 Name 作为列与 Values 作为相应的数值。这个没有问题。但我在使用Dapper在.NET中执行查询,在注意到那些动态列没有被映射到我的类后,我开始研究,发现下面的内容被检索到了。

SQL Server response

所以,这些属性与 \r\n 正在给我带来映射方面的问题。我试图删除列中的那些空格,但没有成功。有什么办法可以解决这个问题吗?

更新一下。

的定义... #features#temptable 是以下内容。

CREATE TABLE #features
(
    [Id] INT,
    [Name] NVARCHAR(80)
)

CREATE TABLE #temptable
(
    [Id] INT,
    [Url] NVARCHAR(200),
    [Title] NVARCHAR(300),
    [Address] NVARCHAR(200),
    [Domain] Tinyint,
    [Price] Real,
    [Code] NVARCHAR(10),
    [Image] NVARCHAR(150), 
    [Name] NVARCHAR(80),
    [Value] NVARCHAR(150)
)

与原来的部分

SET @cols = STUFF((
                    SELECT DISTINCT
                            ','+QUOTENAME([c].[Name])
                    FROM #features c FOR XML PATH(''), TYPE
                 ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');

我得到了以下结果。

Correct values

但是,如果我把这段替换成

SET @cols = REPLACE(REPLACE(STUFF((
                    SELECT DISTINCT
                            ','+QUOTENAME([c].[Name])
                    FROM #features c FOR XML PATH(''), TYPE
                 ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''),CHAR(13), ''), CHAR(10), '')

我在这些动态列中获得了null

Null values after remove \r\n

更新2。

CREATE TABLE #features
(
    [Id] INT,
    [Name] NVARCHAR(80)
)

INSERT INTO #features
    SELECT [Id], [Name] 
    FROM Feature

SELECT DISTINCT
    ', [' + [f].[Name] + ']'
FROM #features f

情况如下

Results of brackets added

但是 Name 字段的值中没有空格。

先谢谢你了。

sql-server tsql pivot whitespace
1个回答
0
投票

当我执行下面的代码时,我确实得到了一个合适的输出。

SET @cols = (SELECT STUFF((SELECT DISTINCT
                    ',' + QUOTENAME(REPLACE(REPLACE([c].[Name], CHAR(13), ''), CHAR(10), ''))
              FROM #features c FOR XML PATH(''), TYPE
              ).value('.', 'NVARCHAR(MAX)'), 1, 1, ''));

SET @query = 'SELECT [Id], 
                     [Url], 
                     [Title], 
                     [Address], 
                     [Domain], 
                     [Price], 
                     [Code],
                     [Image]
                     ' + @cols + '
               FROM (SELECT [Id], 
                            [Url], 
                            [Title], 
                            [Address], 
                            [Domain], 
                            [Price], 
                            [Code],
                            [Image], 
                            [Value] AS [value], 
                            [Name] AS [name] 
                     FROM #temptable) x 
                     PIVOT(max(value) for name in (' + @cols + ')) p';
EXEC (@query);

我想你需要给我们一些两张表的样本数据 才能知道发生了什么。

© www.soinside.com 2019 - 2024. All rights reserved.