【发布时间】:2023-03-28 23:21:02
【问题描述】:
这里可以回答大约 10 个不同的子问题,但主要问题在标题中。 TLDR 版本:我有一个如下例所示的表格,我想替换整个表格中的所有双引号。有没有简单的方法可以做到这一点?
我使用光标的解决方案似乎相当简单。我知道 SQL Server 社区中有一些 CURSOR 仇恨(运行时不好?)。 CURSOR 在什么时候(num 行和/或 num 列)会发臭?
创建可重现的示例表
DROP TABLE IF EXISTS #example;
CREATE TABLE #example (
NumCol INT
,CharCol NVARCHAR(20)
,DateCol NVARCHAR(100)
);
INSERT INTO #example VALUES
(1, '"commas, terrible"', '"2021-01-01 20:15:57,2021:04-08 19:40:50"'),
(2, '"loadsrc,.txt"', '2020-01-01 00:00:05'),
(3, '".txt,from.csv"','1/8/2021 10:14')
目前,我确定的解决方案是:
- 手动更新每一列
UPDATE X SET CharCol = REPLACE(CharCol, '"','')。超过 2 列的 IMO 非常烦人。 - 使用 CURSOR 进行更新(类似于 SQL Server- SQL Replace on all columns in all tables across an entire DB 上看起来很烦人的复杂解决方案
使用 CURSOR 替换字符
这与所有与游标相关的脚本有点复杂,但在其他方面似乎运行良好。
-- declare variable to store colnames, cursor to filter through list, string for dynamic sql code
DECLARE @colname VARCHAR(10)
,@sql VARCHAR(MAX)
,@namecursor CURSOR;
-- run cursor and set colnames and update table
SET @namecursor = CURSOR FOR SELECT ColName FROM #colnames
OPEN @namecursor;
FETCH NEXT FROM @namecursor INTO @colname;
WHILE (@@FETCH_STATUS <> -1) -- alt: WHILE @@FETCH_STATUS = 0
BEGIN;
SET @sql = 'UPDATE #example SET '+@colname+' = REPLACE('+@colname+', ''"'','''')'
EXEC(@sql); -- parentheses VERY important: EXEC(sql-as-string) NOT EXEC storedprocedure
FETCH NEXT FROM @namecursor INTO @colname;
END;
CLOSE @namecursor;
DEALLOCATE @namecursor;
GO
-- see results
SELECT * FROM #example
子问题:虽然我在其他地方的数据库中看到过它,但对于这个特定的示例,我在 Excel 中打开一个 .csv 文件并将其导出为制表符分隔。有没有办法在没有双引号的情况下更改要导出的设置?如果我没记错的话,BULK INSERT 没有办法处理这个问题,也没有办法处理导入带有额外逗号的 csv 文件。
是的,我会假装我很好,日期列中有一个日期时间列表(需要 varchar 数据类型)。
【问题讨论】:
-
不,你几乎明白了。有时编程只是非常烦人......你可以做一些事情,比如将表转储到外部存储并使用其他东西来解析它。或者将整个表格转换为 JSON 或 XML 并替换单个字符串中的字符,然后将其带回您的表格中。但这些更令人讨厌。或者投资于有助于自动化任务的 IDE 工具。
-
您的 SQL Server 版本是多少?
标签: sql-server tsql replace data-cleaning