我有这些桌子
所以我希望我的查询在表任务中
Id=3
时显示此结果
我的查询是这样的,但我不知道如何选择
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 或视图模型 如何更改此查询?
这个代码我改为这个代码
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);
使用临时表,以下内容获取指定的输入并给出指定的输出。
很大程度上,对参数和选定参数表的查询用于动态创建对 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;