如何通过动态和静态列获得结果

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

我有这些桌子 enter image description here

所以我希望我的查询在表任务中

Id=3
时显示此结果

enter image description here

我的查询是这样的,但我不知道如何选择

tableMission
此查询中的列?

DECLARE @SQL nvarchar(MAX);

SET @SQL = N'SELECT ' +
           STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
                         N'       ' + QUOTENAME(extra.[Name])
                  FROM tableparameter extra 
                  Inner Join selectedParameter on extra.id=selectedParameter.parameterId 
                  FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,10,N'') + NCHAR(13) + NCHAR(10) +
                 'FROM tablemissionExtra wpe 
                      INNER JOIN tableMission wp ON wpe.[Id]=wp.[tableMissionExtra] '  ;

EXEC sp_executesql @SQL

我不想使用 temtable 或视图模型 如何更改此查询?

sql sql-server qsqlquery
2个回答
1
投票

这个代码我改为这个代码

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX);
select @cols = STUFF((SELECT N',' + NCHAR(13) + NCHAR(10) +
                     N'       ' + QUOTENAME(extra.[Name])
              FROM tableparameter extra 
              Inner Join selectedParameter on extra.id=selectedParameter.parameterId 
              FOR XML PATH(N''),TYPE).value(N'.','nvarchar(MAX)'),1,10,N'')
    
set @query = 'select wp.*,wpe.'+@cols+
           'FROM tablemissionExtra wpe 
                  INNER JOIN tableMission wp ON wpe.[Id]=wp.[tableMissionExtra] '  ;
execute(@query);

0
投票

使用临时表,以下内容获取指定的输入并给出指定的输出。

很大程度上,对参数和选定参数表的查询用于动态创建对 Mission 和 MissionExtra 的查询。主要技巧是使用 STRING_AGG 组合参数中的列名称。

DROP TABLE IF EXISTS #mission;
DROP TABLE IF EXISTS #missionextra;
DROP TABLE IF EXISTS #parameter;
DROP TABLE IF EXISTS #selectedparameter;

CREATE TABLE #mission (ID INT, MissionMinutes INT);
INSERT INTO #mission VALUES (1, 480), (2, 450), (3, 0);
SELECT * FROM #mission;

CREATE TABLE #missionextra (ID INT, MissionID INT, x INT, y INT);
INSERT INTO #missionextra VALUES (1, 3, 450, 500);
SELECT * FROM #missionextra;

CREATE TABLE #parameter (ID INT, title SYSNAME);
INSERT INTO #parameter VALUES (1, 'x'), (2, 'y');
SELECT * FROM #parameter;

CREATE TABLE #selectedparameter (ID INT, paramID INT);
INSERT INTO #selectedparameter VALUES (1, 1);
SELECT * FROM #selectedparameter;

DECLARE @SQL NVARCHAR(MAX) = (SELECT N'
SELECT m.MissionMinutes, ' + STRING_AGG('me.' + p.title, ',') + N'
FROM #mission m
    INNER JOIN #missionextra me
        ON me.MissionID = m.ID
'
FROM #selectedparameter sp
    INNER JOIN #parameter p
        ON p.ID = sp.paramID
)

PRINT @SQL;

EXEC sp_executesql @SQL;
© www.soinside.com 2019 - 2024. All rights reserved.