Я пытаюсь изменить некоторые строковые значения в SQL, используя циклы и функцию замены. У меня есть две таблицы, откуда я получаю значения и формулы, которые мне нужно изменить. Основная проблема заключается в том, что при выполнении кода я могу изменить первый шаблон соответствия самой первой формулы, но другие шаблоны не изменяются. Я не знаю, является ли проблема тем, как я устанавливаю счетчики или «Выбирает», используемые для поиска значений. Мой код:Замена строковых значений в SQL
IF OBJECT_ID('tempdb..#TABLA_TEMP') IS NOT NULL BEGIN
DROP TABLE #TABLA_TEMP
END
IF OBJECT_ID('tempdb..#TABLE_VALUES') IS NOT NULL BEGIN
DROP TABLE #TABLE_VALUES
END
CREATE TABLE #TABLA_TEMP (
ID INT IDENTITY NOT NULL PRIMARY KEY,
NUMERO VARCHAR(max)
)
INSERT INTO #TABLA_TEMP(NUMERO)VALUES('X=''A01TGR.420.JHNB''+''A02TGR.421.ZASD''')
INSERT INTO #TABLA_TEMP(NUMERO)VALUES('X=''A08TGR.427.YUJK''+''A03TGR.422.CVBN''')
INSERT INTO #TABLA_TEMP(NUMERO)VALUES('X=''A04TGR.423.TYUI''+''A05TGR.424.QWER''')
CREATE TABLE #TABLE_VALUES (
ID INT IDENTITY NOT NULL PRIMARY KEY,
ID_INDICADOR INT,
CODIGO VARCHAR(max),
MtoValor DECIMAL(18,2)
)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19520, 'A01TGR.420.JHNB', 50.00)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19521, 'A02TGR.421.ZASD', 25.00)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19522, 'A03TGR.422.CVBN', 15.00)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19523, 'A04TGR.423.TYUI', 65.00)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19524, 'A05TGR.424.QWER', 30.00)
INSERT INTO #TABLE_VALUES(ID_INDICADOR, CODIGO, MtoValor) VALUES (19527, 'A08TGR.427.YUJK', 45.00)
select * from #TABLA_TEMP
--select * from #TABLE_VALUES
DECLARE @counter int
SET @counter = 1
DECLARE @counterInterno int
SET @counterInterno = 1
WHILE(@counter <= (SELECT MAX(ID) FROM #TABLA_TEMP)) BEGIN
DECLARE @MatchExpression VARCHAR(max)
SET @MatchExpression = (''+ CAST(((SELECT CODIGO FROM #TABLE_VALUES
WHERE ID = @counter)) AS VARCHAR) +'')
--WHILE 1 = 1
WHILE(@counterInterno <= (SELECT MAX(ID) FROM #TABLE_VALUES)) BEGIN
DECLARE @valorInterno VARCHAR(MAX)
SET @valorInterno = (''+ CAST(((SELECT MtoValor FROM #TABLE_VALUES V
WHERE V.ID = @counterInterno)) AS VARCHAR) +'')
DECLARE @RetVal varchar(max)
SET @RetVal = (SELECT REPLACE(NUMERO, @MatchExpression, @valorInterno)
FROM #TABLA_TEMP T WHERE T.ID = @counterInterno)
IF(@RetVal IS NOT NULL)
UPDATE #TABLA_TEMP
SET NUMERO = @RetVal
WHERE ID = @counter
ELSE
break
SET @counterInterno = @counterInterno + 1
SET @counter = @counter + 1
END
END
SELECT * FROM #TABLA_TEMP
В конце концов, идея заключается в том, чтобы получить что-то вроде этого:
X='65'+'15'+'25'
Любая помощь будет оценена.
Wow братан, он работал как шарм !!!!! То, как вы просто используете один цикл, делает его очень элегантным и эффективным решением! Благодарю. – Adrian87