您可以先将原始数据插入临时表。然后您可以转换暂存表中的值,然后将它们插入到实际表中,或者同时插入和转换。
以下是您可以进行转换的方法。
对于每个输入值,您都需要检查它是否有减号。如果是这样,则应在最后一个位置删除一个字符,并在第一个位置插入一个字符。否则不应删除或插入任何内容。
所以,基本上你可以用 1 或 0 的形式表示,并使用该数字来确定要插入或删除多少个字符。
有多种方法可以获得 1/0 结果。
例如,您可以将输入值的最后一个字符作为子字符串,并使用 CHARINDEX 在该子字符串中搜索-:
CHARINDEX('-', LEFT(InputValue, LEN(InputValue)))
如果InputValue的最后一个字符是'-',则CHARINDEX返回1,否则返回0。
另一种方法,也使用CHARINDEX,是这样的:
CAST(CHARINDEX('-', InputValue) AS bit)
如果InputValue 有负号,CHARINDEX 将返回正结果,CAST 会将其转换为 1。如果没有负号,CHARINDEX 会给您一个 0,在演员表。
现在您可以使用表达式的结果来确定:
-
是否删除最后一个字符:
STUFF(InputValue, LEN(InputValue), <b>CAST(CHARINDEX('-', InputValue) AS bit)</b>, '')
和
-
是否在值前加上'-':
REPLICATE('-', <b>CAST(CHARINDEX('-', InputValue) AS bit)</b>)
也就是说,完整的表达式是这样的:
REPLICATE('-', CAST(CHARINDEX('-', InputValue) AS bit)) +
STUFF(InputValue, LEN(InputValue), CAST(CHARINDEX('-', InputValue) AS bit), '')
在最后的语句中,您还可以使用CROSS APPLY 来避免重复强调的子表达式,类似于此行(假设您将选择进行插入+处理):
INSERT INTO dbo.TargetTable (columns)
SELECT
...
REPLICATE('-', x.HasMinus) + STUFF(InputValue, LEN(InputValue), x.HasMinus, ''),
...
FROM dbo.StagingTable
CROSS APPLY (SELECT CAST(CHARINDEX('-', InputValue) AS bit)) AS x (HasMinus)
;