[英]Replacing certain part of a string in SQL
我有一個包含數據的平面文件,並且在每一行中都有自己想要的特定位置:
我的數據示例如下所示:
ALD2018041620180416FRAP 25CEUR 0017537400 TUYAU DE FREIN BRAKE HOSE P70 0000000203300000000000 00001000000000000520J
ALD2018041620180416FRAP 25CEUR 0017689400 CYLINDRE ROUE WHEEL CYLINDER W70 0000000145200000000000 00001000000000000455K
在此文本中,我想將長度為11個字符的字符100處的文本替換為我計算出的十進制值(該值是貨幣值),我需要將其轉換為美分,然后總計為長11個字符。
我要更改的部分在此之后(這只是為了您可以輕松找到位置):
00000002033
00000001452
因此,在上面的2行中,我想要以下結果:
ALD2018041620180416FRAP 25CEUR 0017537400 TUYAU DE FREIN BRAKE HOSE P70 0000000203300000091972 00001000000000000520J
ALD2018041620180416FRAP 25CEUR 0017689400 CYLINDRE ROUE WHEEL CYLINDER W70 0000000145200000065688 00001000000000000455K
這是我的結果:
ALD2018041620180416FRAP 25CEUR 0017537400 TUYAU DE FREIN BRAKE HOSE P70 0000000203391972.920000 0000191972.9200000520J
ALD2018041620180416FRAP 25CEUR 0017689400 CYLINDRE ROUE WHEEL CYLINDER W70 0000000145265688.480000 0000165688.4800000455K
我正在使用SUBSTRING
嘗試在我想要的特定位置進行替換,該方法可以工作....但是它也在文本中進一步替換,我不希望這樣做(顯然)。 另外,我不知道如何從小數點到末尾刪除(這似乎總是帶有小數點的7個字符),然后在前面添加正確數量的0以使整個長度為11個字符。
編輯
我已經想出了如何通過替換來僅替換FIRST事件:
SET @TextToChange = REPLACE(@TextToChange,SUBSTRING(@TextToChange,100,11),(((CAST(@UnitPurchasePriceexVAT as decimal(11,2))/100) * @ExchangeRate * 100) * @RetailePriceValue)*100)
有了這個:
SET @TextToChange = STUFF(@TextToChange, CHARINDEX(SUBSTRING(@TextToChange,100,11), @TextToChange), LEN(SUBSTRING(@TextToChange,100,11)), (((CAST(@UnitPurchasePriceexVAT as decimal(11,2))/100) * @ExchangeRate * 100) * @RetailePriceValue)*100)
這是我正在嘗試的代碼:
DECLARE @FilePath as Varchar(1000)
DECLARE @TotalRecords as INT
DECLARE @RecordCount AS INT
SET @FilePath = 'C:\Client Files\Client\AP\2018-07-17\AP-XP0006-Test.txt'
DECLARE @UnitPurchasePriceexVAT As Varchar(11)
DECLARE @TextToChange As Varchar(MAX)
DECLARE @ExchangeRate as Decimal(18,4)
DECLARE @RetailePriceValue as Decimal(18,4)
SET @ExchangeRate = (SELECT CalcValue FROM CalculationValues WHERE CalcName = 'Exchange Rate')
SET @RetailePriceValue = (SELECT CalcValue FROM CalculationValues WHERE CalcName = 'Retail Price Value')
CREATE TABLE #SparePartsPriceList_Temp
(Text Varchar(MAX) NULL)
DECLARE @SQL as Varchar(MAX)
SET @SQL = 'bulk insert #SparePartsPriceList_Temp
from ''' + @FilePath + '''
with (fieldterminator = ''\t'', rowterminator = ''0x0a'')'
EXEC (@SQL)
CREATE TABLE #SparePartsPriceList_Temp_staging
(ID int IDENTITY(1,1) PRIMARY KEY,
Text Varchar(MAX) NULL)
CREATE TABLE #SparePartsPriceList_Temp_Export
(Text Varchar(MAX) NULL)
INSERT INTO #SparePartsPriceList_Temp_staging(Text)
SELECT Text FROM #SparePartsPriceList_Temp
SET @TotalRecords = (SELECT COUNT(TEXT) FROM #SparePartsPriceList_Temp_staging)
SET @RecordCount = 1
WHILE (@RecordCount <= @TotalRecords)
BEGIN
SET @TextToChange = (SELECT Text FROM #SparePartsPriceList_Temp_staging WHERE ID = @RecordCount)
SET @UnitPurchasePriceexVAT = (SELECT SUBSTRING(@TextToChange,89,11))
SET @TextToChange = STUFF(@TextToChange, CHARINDEX(SUBSTRING(@TextToChange,100,11), @TextToChange), LEN(SUBSTRING(@TextToChange,100,11)), (((CAST(@UnitPurchasePriceexVAT as decimal(11,2))/100) * @ExchangeRate * 100) * @RetailePriceValue)*100)
INSERT INTO #SparePartsPriceList_Temp_Export
SELECT @TextToChange
SET @RecordCount = @RecordCount + 1
END
SELECT * FROM #SparePartsPriceList_Temp_Export
SELECT * FROM #SparePartsPriceList_Temp
DROP TABLE #SparePartsPriceList_Temp
DROP TABLE #SparePartsPriceList_Temp_staging
DROP TABLE #SparePartsPriceList_Temp_Export
這有點冗長,但是我不知道該怎么解釋。 我希望我想要的東西有意義並且我不會受到太多懲罰...
謝謝你的幫助!
所以我終於得到了答案! 我不確定這是否會對任何人有幫助,但我發布是為了以防萬一:
DECLARE @DealerType as VarChar(20)
DECLARE @FilePath as Varchar(1000)
DECLARE @TotalRecords as INT
DECLARE @RecordCount AS INT
DECLARE @DecimalIndex as INT
SET @DealerType = 'ClientName'
SET @FilePath = 'C:\Client Files\Client\AP\2018-07-17\AP-XP0006_MULTI.txt'
DECLARE @UnitPurchasePriceexVAT As Varchar(11)
DECLARE @NewUnitSellingPriceExVAT as Varchar(11)
DECLARE @TextToChange As Varchar(MAX)
DECLARE @ExchangeRate as Decimal(18,4)
DECLARE @RetailePriceValue as Decimal(18,4)
SET @ExchangeRate = (SELECT CalcValue FROM CalculationValues WHERE CalcName = 'Exchange Rate')
SET @RetailePriceValue = (SELECT CalcValue FROM CalculationValues WHERE CalcName = 'Retail Price Value')
CREATE TABLE #SparePartsPriceList_Temp
(Text Varchar(MAX) NULL)
DECLARE @SQL as Varchar(MAX)
SET @SQL = 'bulk insert #SparePartsPriceList_Temp
from ''' + @FilePath + '''
with (fieldterminator = ''\t'', rowterminator = ''0x0a'')'
EXEC (@SQL)
CREATE TABLE #SparePartsPriceList_Temp_staging
(ID int IDENTITY(1,1) PRIMARY KEY,
Text Varchar(MAX) NULL)
CREATE TABLE SparePartsPriceList_Temp_Export
(Text Varchar(MAX) NULL)
INSERT INTO #SparePartsPriceList_Temp_staging(Text)
SELECT Text FROM #SparePartsPriceList_Temp
SET @TotalRecords = (SELECT COUNT(TEXT) FROM #SparePartsPriceList_Temp_staging)
SET @RecordCount = 1
WHILE (@RecordCount <= @TotalRecords)
BEGIN
SET @TextToChange = (SELECT Text FROM #SparePartsPriceList_Temp_staging WHERE ID = @RecordCount)
SET @UnitPurchasePriceexVAT = (SELECT SUBSTRING(@TextToChange,89,11))
SET @NewUnitSellingPriceExVAT = CAST((((CAST(@UnitPurchasePriceexVAT as decimal(11,2))/100) * @ExchangeRate * 100) * @RetailePriceValue)*100 as varchar)
SET @DecimalIndex = CHARINDEX('.',@NewUnitSellingPriceExVAT,1)
SET @NewUnitSellingPriceExVAT = STUFF(@NewUnitSellingPriceExVAT, CHARINDEX(SUBSTRING(CAST(@NewUnitSellingPriceExVAT as Varchar),@DecimalIndex,7), @NewUnitSellingPriceExVAT),
LEN(SUBSTRING(CAST(@NewUnitSellingPriceExVAT as Varchar),@DecimalIndex,7)),
'')
SET @NewUnitSellingPriceExVAT = REPLICATE('0',11-LEN(@NewUnitSellingPriceExVAT)) + @NewUnitSellingPriceExVAT
SET @TextToChange = STUFF(@TextToChange, CHARINDEX(SUBSTRING(@TextToChange,100,11), @TextToChange), LEN(SUBSTRING(@TextToChange,100,11)), @NewUnitSellingPriceExVAT)
INSERT INTO SparePartsPriceList_Temp_Export
SELECT @TextToChange
SET @RecordCount = @RecordCount + 1
END
SELECT * FROM SparePartsPriceList_Temp_Export
SELECT * FROM #SparePartsPriceList_Temp
DROP TABLE #SparePartsPriceList_Temp
DROP TABLE #SparePartsPriceList_Temp_staging
DROP TABLE SparePartsPriceList_Temp_Export
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.