如何从所有 tables/columns 中删除所有换行符
How to remove all new line characters from all tables/columns
我正在将数据库从 SQL 服务器导出到 Snowflake,但我 运行 遇到了一个问题,即我们有未知数量的列,其中包含用户评论和换行符他们。问题是数据库有超过 280 个 table,我不想手动检查每个 table。我想知道是否有办法使它自动化。
我目前正在使用 SSIS 导出数据,只是在我发现具有换行符的列上执行 select 替换。
我也用过这个脚本:
declare @NewLine char(2) set @NewLine=char(13)+char(10) update Projects set [PR_ITComment] =Replace([PR_ITComment] , @NewLine,'') WHERE [PR_ITComment] like '%' +@NewLine +'%'
这是解决此问题的一种方法。这利用了动态 sql 因此您不必求助于循环。您可能需要稍微调整一下以满足您的需要。您可以添加另一个谓词以防止列表中的某些表或类似的东西。它的工作方式是创建大量的更新语句。然后你只需执行大量的字符串。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'Update ' + quotename(t.name) + ' set ' + quotename(c.name) + ' = replace(Replace(' + quotename(c.name) + ', char(10), ''''), char(13), '''');'
from sys.tables t
join sys.columns c on c.object_id = t.object_id
join sys.systypes st on st.xtype = c.system_type_id
where st.name in ('text', 'ntext', 'varchar', 'nvarchar', 'char', 'nchar')
select @SQL
--Once you are comfortable with the output you can uncomment the line below to actually run this.
--exec sp_executesql @SQL
这类似于 Sean Lange 的回答,但它解析为每 table 一次更新,而不是每列一次更新。
--declare @schema nvarchar(256) = 'dbo';
--declare @table nvarchar(256) = 'table';
declare @sql nvarchar(max) = '';
set @sql += (select 'update '+t.table_schema+'.'+t.table_name+' set ' +stuff(
( select ', ['+i.column_name +']=replace(replace(['+i.column_name+'],char(10),''''),char(13),'''')'+char(10)
from information_schema.columns i
where i.table_schema=t.table_schema
and i.table_name=t.table_name
and i.data_type in ('char','nchar','varchar','nvarchar','text','ntext')
order by i.ordinal_position
for xml path('')),1,1,'')+';'+char(10)
from information_schema.tables t
where t.table_type='base table'
--and t.table_schema = @schema
--and t.table_name = @table
for xml path (''), type).value('.','varchar(max)')
--print @sql
select @sql
--exec sp_executesql @sql
如果您能够使用引号(这是标准的 CSV 方式)导出数据,Snowflake 可以简单地用新行加载数据。您也可以使用转义,但引用更好。
包含 3 行的示例文件
$ cat data.csv
1,"a",b
2,c,"d1
d2"
3,"e1,e2,
e3",f
示例 SQL 和输出:
create or replace table x(nr int, a string, b string);
put file://data.csv @%x;
copy into x file_format = (field_optionally_enclosed_by = '"');
select * from x;
----+--------+----+
NR | A | B |
----+--------+----+
1 | a | b |
2 | c | d1 |
| | d2 |
3 | e1,e2, | f |
| e3 | |
----+--------+----+
我在将数据导出到 excel 时遇到了同样的问题。
您可以使用 '' 替换 char(13) 和 char(10)。那可行。
在您的 "Execure SQL" 任务查询或 SSIS 的 SP 中很容易替换。或者您可以在更新语句中使用它来永远更新记录。
我正在将数据库从 SQL 服务器导出到 Snowflake,但我 运行 遇到了一个问题,即我们有未知数量的列,其中包含用户评论和换行符他们。问题是数据库有超过 280 个 table,我不想手动检查每个 table。我想知道是否有办法使它自动化。
我目前正在使用 SSIS 导出数据,只是在我发现具有换行符的列上执行 select 替换。
我也用过这个脚本:
declare @NewLine char(2) set @NewLine=char(13)+char(10) update Projects set [PR_ITComment] =Replace([PR_ITComment] , @NewLine,'') WHERE [PR_ITComment] like '%' +@NewLine +'%'
这是解决此问题的一种方法。这利用了动态 sql 因此您不必求助于循环。您可能需要稍微调整一下以满足您的需要。您可以添加另一个谓词以防止列表中的某些表或类似的东西。它的工作方式是创建大量的更新语句。然后你只需执行大量的字符串。
declare @SQL nvarchar(max) = ''
select @SQL = @SQL + 'Update ' + quotename(t.name) + ' set ' + quotename(c.name) + ' = replace(Replace(' + quotename(c.name) + ', char(10), ''''), char(13), '''');'
from sys.tables t
join sys.columns c on c.object_id = t.object_id
join sys.systypes st on st.xtype = c.system_type_id
where st.name in ('text', 'ntext', 'varchar', 'nvarchar', 'char', 'nchar')
select @SQL
--Once you are comfortable with the output you can uncomment the line below to actually run this.
--exec sp_executesql @SQL
这类似于 Sean Lange 的回答,但它解析为每 table 一次更新,而不是每列一次更新。
--declare @schema nvarchar(256) = 'dbo';
--declare @table nvarchar(256) = 'table';
declare @sql nvarchar(max) = '';
set @sql += (select 'update '+t.table_schema+'.'+t.table_name+' set ' +stuff(
( select ', ['+i.column_name +']=replace(replace(['+i.column_name+'],char(10),''''),char(13),'''')'+char(10)
from information_schema.columns i
where i.table_schema=t.table_schema
and i.table_name=t.table_name
and i.data_type in ('char','nchar','varchar','nvarchar','text','ntext')
order by i.ordinal_position
for xml path('')),1,1,'')+';'+char(10)
from information_schema.tables t
where t.table_type='base table'
--and t.table_schema = @schema
--and t.table_name = @table
for xml path (''), type).value('.','varchar(max)')
--print @sql
select @sql
--exec sp_executesql @sql
如果您能够使用引号(这是标准的 CSV 方式)导出数据,Snowflake 可以简单地用新行加载数据。您也可以使用转义,但引用更好。
包含 3 行的示例文件
$ cat data.csv
1,"a",b
2,c,"d1
d2"
3,"e1,e2,
e3",f
示例 SQL 和输出:
create or replace table x(nr int, a string, b string);
put file://data.csv @%x;
copy into x file_format = (field_optionally_enclosed_by = '"');
select * from x;
----+--------+----+
NR | A | B |
----+--------+----+
1 | a | b |
2 | c | d1 |
| | d2 |
3 | e1,e2, | f |
| e3 | |
----+--------+----+
我在将数据导出到 excel 时遇到了同样的问题。 您可以使用 '' 替换 char(13) 和 char(10)。那可行。
在您的 "Execure SQL" 任务查询或 SSIS 的 SP 中很容易替换。或者您可以在更新语句中使用它来永远更新记录。