答案我在SSC提出,但在這裏張貼OP並沒有消耗品DDL和樣本數據請求:
CREATE TABLE #Metrics (MetricID VARCHAR(5),
MetricDate DATE,
MetricValue INT);
CREATE TABLE #Calculations (CalculationID VARCHAR(4), --These shouldn't have the same name in both tables as they are not the same thing
Calculation VARCHAR(500));
GO
INSERT INTO #Metrics
VALUES
('SC-1a','20170227',883),
('SC-1b','20170227',1025),
('SC-2a','20170227',734),
('SC-2b','20170227',291),
('SC-2c','20170227',0),
('SC-2d','20170227',19),
('SC-2e','20170227',0),
('SC-2f','20170227',58),
('SC-2g','20170227',1),
('SC-2h','20170227',0),
('SC-2i','20170227',0);
INSERT INTO #Calculations
VALUES
('SC-1','SC-1a/SC-1b'),
('SC-2', '((SC-2a + SC-2b + SC-2c) - (SC-2d + SC-2e + SC-2f + SC-2g + SC-2h + SC-2i))/(SC-2a + SC-2b + SC-2c)');
GO
SELECT CalculationID, Calculation, 1 AS RN
FROM #Calculations C
LEFT JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', C.Calculation) > 0
WHERE C.CalculationID = 'SC-1'
GO
DECLARE @DATE DATE = '27-Feb-2017';
WITH Replacements AS (
SELECT CalculationID, Calculation, Calculation As CastCalculation, 1 AS RN
FROM #Calculations C
--WHERE C.CalculationID = 'SC-1'
UNION ALL
SELECT R.CalculationID,
CAST(REPLACE(R.Calculation, M.MetricID, CAST(M.MetricValue AS varchar(100))) AS varchar(500)),
CAST(REPLACE(R.Calculation, M.MetricID, 'CAST(' + CAST(M.MetricValue AS varchar(100)) + ' AS decimal(12,4))') AS varchar(500)),
RN + 1
FROM Replacements R
JOIN #Metrics M ON PATINDEX('%' + M.MetricID + '%', R.Calculation) > 0
AND M.MetricDate = @Date
AND CHAR(RN + 96) = RIGHT(M.MetricID,1)
)
SELECT *
INTO #DSQL
FROM Replacements R
WHERE RN = (SELECT MAX(sq.RN) FROM Replacements sq WHERE sq.CalculationID = R.CalculationID);
DECLARE @SQL VARCHAR(MAX);
SELECT @SQL = STUFF((SELECT 'UNION ALL' + CHAR(10) + 'SELECT ''' + CalculationID + ''' AS CalculationID, ''' + Calculation + ''' AS Calculation, ' + CastCalculation + ' AS CalculatedMetricValue' + CHAR(10)
FROM #DSQL
FOR XML PATH('')),1,10,'')
SELECT @SQL;
EXEC (@SQL);
DROP TABLE #DSQL;
GO
--Clean up
DROP TABLE #Metrics;
DROP TABLE #Calculations;
附:響應是的,我知道我不需要臨時表#DSQL,我只能從CTE替換中得到結果。主要原因是我在那個時候把它分開,這樣我就可以分開思考過程,然後我就不會把兩者合併在一起。