- http://stackoverflow.com/questions/18881913/replace-occurrences-of-a-list-of-strings-in-a-string-without-a-cursor-in-t-sql
- Кодекс принимает ваше исходное определение отчета указателя строки, затем замените ссылочные указатели на формулы, сформируйте план выполнения линии
-- ORIGINAL REPORT FORMULATIONS
DECLARE @REPORT AS TABLE (RowID BIGINT,[Description] VARCHAR(MAX),Amount VARCHAR(MAX));
-- RABLE FROM THE OUTPUTED FINAL REPORT
DECLARE @FinalReport AS TABLE (RowID BIGINT,[Description] VARCHAR(MAX),Amount VARCHAR(MAX));
-- TABLE TO STORE CONVERSTION CROSS REVERANCE IN
DECLARE @DO TABLE (REF VARCHAR(MAX),[ACTION] VARCHAR(MAX));
DECLARE
@RID BIGINT, --- REPORT POINTER TO READ FROM CURSOR
@DESC VARCHAR(MAX), --- REPORT DESCRIPTION TO READ FROM CURSOR
@FORMULA VARCHAR(MAX), --- FORMULA FOR REPORT DEFINITION
@SQL NVARCHAR(MAX), --- SQL TO PASS TO SP_EXECUTESQL
@PRAMS NVARCHAR(MAX) = '@RETURN AS DECIMAL(18,10) OUTPUT', --- PRAMAS USED IN SP_EXECUTESQL
@RETURNED DECIMAL(18,10) --- VALUE RETURNED FROM SP_EXECUTESQL
-- LOAD UP REPORT EXAMPLES
INSERT INTO @REPORT (RowID,[Description],Amount) VALUES
(470,'Gross Furniture Revenue','10000'),
(471,'Less:Medals & Specials','-7500'),
(472,'Adjusted Gross Furn.Revenue','R0470+R0471'),
(473,'1/2 X SUBTOTAL','R0472/2'),
(474,'ADD SOME VALUE','283.45'),
(475,'TOTAL','R0473+R0474');
-- CREATE CROSS REF TABLE DATA
INSERT INTO @DO (REF,[ACTION])
SELECT RTRIM(LTRIM('R' + RIGHT('000000' + CAST(RowID AS VARCHAR(10)),4))) AS REF ,RTRIM(LTRIM(Amount)) AS [ACTION] FROM @REPORT;
-- LOOP THROUGH REPORT DEFINITION FILE TO GENERATE FINAL REPORT
DECLARE BUILDREPORT CURSOR FOR SELECT RowID,[Description],Amount FROM @REPORT;
OPEN BUILDREPORT;
FETCH NEXT FROM BUILDREPORT INTO @RID, @DESC, @FORMULA;
WHILE @@FETCH_STATUS = 0
BEGIN
-- NOTE, BESURE TO WRAP THE SUBSTITUTED FORMULAS IN BRACKETS TO INSURE CORRECT CALCULATIONS
SELECT @FORMULA = REPLACE(@FORMULA, REF, '(' + [ACTION] + ')') FROM @DO ORDER BY REF DESC;
-- REPLACE REF WITH VALUES
SET @SQL = N'SELECT @RETURN = CAST((' + @FORMULA + N') AS DECIMAL(18,10)) '
-- PROCESS CALCULATIONS
EXEC SP_EXECUTESQL @SQL , @PRAMS, @RETURN = @RETURNED OUTPUT
-- OUTPUT REPORT
INSERT INTO @FinalReport(RowID,[Description],Amount) VALUES(@RID, @DESC,@RETURNED);
FETCH NEXT FROM BUILDREPORT INTO @RID, @DESC, @FORMULA;
END;
CLOSE BUILDREPORT;
DEALLOCATE BUILDREPORT;
-- SHOW REPORT
SELECT * FROM @FinalReport
Это ... очень странный способ получить данные он выглядит так, как будто вам нужно выполнить динамический запрос. – SLin
Я знаю, это ужасно. Любые идеи о том, как я буду это делать? – april4181
Что означает r0470? вы отбросили бы r? – 1010