String 如果分号前面没有“0”,则将其替换为“0”;(双引号)

String 如果分号前面没有“0”,则将其替换为“0”;(双引号),string,tsql,replace,str-replace,sql-server-2019,String,Tsql,Replace,Str Replace,Sql Server 2019,我有一个类似“Column”的字符串;“专栏”;“列” 然而,我多次看到: ​“列”;“列;”;“列” (请注意第二个字段中的额外分号) 是否可以找到分号(;)没有被双引号(“)包围的所有实例,并将其替换为零 类似于替换(@string,[a-z][0-9];”,“”) “列”;“列”;“;“Column”变为“Column”;“Column”;“Column” “值”;“值”;“;“Value”变成“Value”;“Value”;“Value” “某物”;别的东西;“另一个;在不知道表的定义的

我有一个类似
“Column”的字符串;“专栏”;“列”

然而,我多次看到:

​<代码>“列”;“列;”;“列”

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

是否可以找到分号(
)没有被双引号(
)包围的所有实例,并将其替换为零

类似于
替换(@string,[a-z][0-9];”,“”)

“列”;“列”;“;“Column
”变为
“Column”;“Column”;“Column”

“值”;“值”;“;“Value”
变成
“Value”;“Value”;“Value”


“某物”;别的东西;“另一个;在不知道表的定义的情况下,thing“变成了
“某物”;“另一物”
,,这是一个模糊的答案

在SQL Server 2017中(如果我没有记错的话),对CSV格式的支持被添加到大容量插入中,这意味着您可以同时指定列分隔符、行分隔符和引号标识符。对于上述内容,这意味着您的
字段终止符将需要值
;“
,而
字段引号将需要值
。然而,这将留下剩余的
用双引号括起来的字符

因此,我建议创建一个staging表,其中所有列都是
(n)varchar
批量插入
您的数据到该表中,然后
插入
数据到生产表中,使用
替换
操作符删除剩余的
字符并强键入它们

在伪SQL中,这看起来像这样:

BULK INSERT Staging.YourTable
来自“C:\YourFilePath\YourFile.txt”
使用(FORMAT='CSV',
FIELDQUOTE=“”,
字段终止符=';');
插入Production.YourTable(第1列、第2列、第3列、第4列)
选择“替换”(第1列“;”、“”),
尝试转换(int,REPLACE(Column2,,;,,,,),
尝试转换(日期,替换(第3列“;”,“”),103),
替换(第4列“;”,“”)
从Staging.YourTable;

不确定这是否过于简单化,但如果您真的将该字符串放在@string中,那么我看不出有任何理由不起作用:

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

你需要正则表达式才能正确地做到这一点,TSQL在这方面不是很在行。这意味着?在我的TSQL脚本之外?或者使用内联代码?最好是在外部,但如果你想沿着这条路走下去,你可以使用SQLCLR函数你的问题,@Henrov…恕我直言,除非你的问题解释了真正的问题是什么,否则没有什么意义进入聊天,信息应该是在问题,而不是聊天。虽然我已经回答了这个问题的基础上,我认为你是问。这就假定分号不能出现在中间的价值,最后一个“列”将不包含分号。