簡體   English   中英

替換SQL中字符串的某些部分

[英]Replacing certain part of a string in SQL

我有一個包含數據的平面文件,並且在每一行中都有自己想要的特定位置:

  1. 替換為貨幣值(此為小數)
  2. 將此小數點后兩位設為11個字符。

我的數據示例如下所示:

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM