如果前面没有“(双引号),则将分号替换为空

Replace semi-colon with nothing if NOT preceded by " (double quote)

我有一个像 "Column";"Column";"Column".

这样的字符串

然而,有几次我看到:

"Column";"Column;";"Column"

(注意第二个字段中的额外分号)。

是否可以找到分号 (;) 未被双引号 (") 包围的所有实例并将其替换为空?

类似于 replace(@string,'[a-z][0-9];','') ?

"Column";"Column;";"Column" 变成 "Column";"Column";"Column"

"Value";"Value;";"Value"变成"Value";"Value";"Value"

"Something";";Something else;";"Another ;thing" 变成 "Something";"Something else";"Another thing"

不知道您 table 的定义,这是一个模糊的答案。

在 SQL Server 2017(如果我没记错的话)中,BULK INSERT 添加了对 CSV 格式的支持,这意味着您可以同时指定列和行分隔符 引用标识符。对于上述内容,这意味着您的 FIELDTERMINATOR 需要值 ';',而 FIELDQUOTE 需要值 '"'。但是,这将保留用双引号引起来的其余 ; 个字符。

因此,我建议创建一个分段 table,其中所有列都是 (n)varcharBULK INSERT 您的数据,然后 INSERT 将数据放入您的生产 table,使用 REPLACE 运算符删除剩余的 ; 个字符并强类型化它们。

在伪 SQL 中看起来像这样:

BULK INSERT Staging.YourTable
FROM 'C:\YourFilePath\YourFile.txt'
WITH (FORMAT='CSV',
      FIELDQUOTE='"',
      FIELDTERMINATOR=';');

INSERT INTO Production.YourTable (Column1, Column2, Column3, Column4)
SELECT REPLACE(Column1,';',''),
       TRY_CONVERT(int,REPLACE(Column2,';','')),
       TRY_CONVERT(date,REPLACE(Column3,';',''),103),
       REPLACE(Column4,';','')
FROM Staging.YourTable;

不确定这是否过于简单化,但如果您确实在 @string 中有该字符串,那么我认为没有理由这不起作用:

replace(@string, ';";"', '";"')