【问题标题】:Get Dynamic PIVOT result executed with in EXEC() to a varchar variable获取在 EXEC() 中执行的动态 PIVOT 结果到 varchar 变量
【发布时间】:2019-06-11 05:51:46
【问题描述】:

以下代码创建一个JSON 输出。

请注意:#Person 表中的值是动态生成的。一旦我调用包含以下代码段的存储过程,C# 代码将输出标识为JSON,尽管它看起来像VARCHAR。我需要输出 JSON 为string(VARCHAR),因为 C# 模型不能根据#Names返回的值动态生成。

DROP TABLE #Names
DROP TABLE #PersonInfo    

CREATE TABLE #Names (ID INT,Name VARCHAR(MAX))
CREATE TABLE #PersonInfo (ID INT,NameID INT,Subject VARCHAR(100),Marks INT)

INSERT INTO #Names VALUES (1,'Paul');
INSERT INTO #Names VALUES (2,'John');
INSERT INTO #Names VALUES (3,'Tayler');

INSERT INTO #PersonInfo VALUES (1,1,'Maths',95);
INSERT INTO #PersonInfo VALUES (2,2,'Science',32);
INSERT INTO #PersonInfo VALUES (3,3,'History',23);
INSERT INTO #PersonInfo VALUES (4,2,'Maths',32);
INSERT INTO #PersonInfo VALUES (5,3,'Science',60);
INSERT INTO #PersonInfo VALUES (6,1,'Music',60);

DECLARE @DynamicCols NVARCHAR(MAX) = '';
DECLARE @pvt NVARCHAR(MAX) = '';
DECLARE @SQLQuery NVARCHAR(MAX) = '';

SELECT @DynamicCols +=  ', SUM(' +QUOTENAME([Name])+') AS '+[Name] FROM #Names;
SET @DynamicCols = STUFF(@DynamicCols,1,1,'')
SELECT @pvt +=  ', ' +QUOTENAME([Name]) FROM #Names;
SET @pvt = STUFF(@pvt,1,1,'')

EXEC ('
SELECT [Subject],' + @DynamicCols+'
FROM (SELECT [NameID], [Subject], [Marks] FROM #PersonInfo) a
INNER JOIN #Names b ON a.NameID = b.ID
PIVOT 
(
  SUM([Marks])
  FOR [Name] IN ('+ @pvt+')
)   PIV
GROUP BY [Subject] FOR JSON AUTO, INCLUDE_NULL_VALUES');

结果

[{"Subject":"History","Paul":null,"John":null,"Tayler":23},{"Subject":"Maths","Paul":95,"John":32,"Tayler":null},{"Subject":"Music","Paul":60,"John":null,"Tayler":null},{"Subject":"Science","Paul":null,"John":32,"Tayler":60}]

DAL 层中的 C# 代码

public string GetMarks(string partyRoleIdList)
  {
   return _context.Query<string>(usp_GetMarks, new { IdList }).SingleOrDefault();
  }

有没有办法将执行值(EXEC())转换为VARCHAR(MAX)??

【问题讨论】:

  • 只是确认一下,这段代码目前不起作用怎么办?我的理解是 FOR JSON 的输出是一个 nvarchar(max) 类型,所以我认为这已经基本上是你想要的了?

标签: json sql-server tsql pivot exec


【解决方案1】:

您可以轻松测试FOR JSON 的结果是NVARCHAR(MAX) 字符串:

exec sp_describe_first_result_set N'
SELECT *
FROM
(
    VALUES(''[a'')
) DS(col)
FOR JSON AUTO
';

产生这个:

is_hidden   column_ordinal  name    is_nullable system_type_id  system_type_name    max_length  precision   scale   collation_name
0   1   JSON_F52E2B61-18A1-11d1-B105-00805F49916B   1   231 nvarchar(max)   -1  0   0   SQL_Latin1_General_CP1_CI_AS

它是字符串,所以你可以很容易地将它转换为VARCHAR(MAX) 或其他东西:

EXEC ('
SELECT CAST(
(
SELECT [Subject],' + @DynamicCols+'
FROM (SELECT [NameID], [Subject], [Marks] FROM #PersonInfo) a
INNER JOIN #Names b ON a.NameID = b.ID
PIVOT 
(
  SUM([Marks])
  FOR [Name] IN ('+ @pvt+')
)   PIV
GROUP BY [Subject] FOR JSON AUTO, INCLUDE_NULL_VALUES)
 AS VARCHAR(400))');

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-10-01
    • 1970-01-01
    • 1970-01-01
    • 2020-02-17
    • 1970-01-01
    • 2012-09-10
    • 2018-02-15
    相关资源
    最近更新 更多