如何从所有表/列中删除所有换行符

sql-server ssis snowflake-datawarehouse

809 观看

4回复

18 作者的声誉

我正在将数据库从SQL Server导出到Snowflake,但遇到了一个问题,即我们的列数未知,其中包含用户注释,并且其中包含换行符。问题是数据库有280多个表,我不想手动浏览每个表。我想知道是否有一种自动化的方法。

我目前正在使用SSIS导出数据,并且只是在我发现具有换行符的列上进行选择替换。

我也使用了此脚本:

declare @NewLine char(2) set @NewLine=char(13)+char(10) update Projects set [PR_ITComment] =Replace([PR_ITComment] , @NewLine,'') WHERE [PR_ITComment] like '%' +@NewLine +'%'
作者: unreal 的来源 发布者: 2017 年 1 月 20 日

回应 (4)


1

27540 作者的声誉

这是解决此问题的一种方法。这利用了动态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 发布者: 20.01.2017 10:20

0

32705 作者的声誉

决定

这与Sean Lange的答案类似,但是它决定对每个表进行一次更新,而不是对每一列进行一次更新。

--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
作者: SqlZim 发布者: 20.01.2017 10:29

0

2320 作者的声誉

如果您能够使用引号(这是标准的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     |    |
----+--------+----+
作者: Marcin Zukowski 发布者: 24.01.2017 08:17

0

46 作者的声誉

将数据导出到excel时遇到相同的问题。您可以使用''替换char(13)和char(10)。那可行。

它可以轻松替换为“ Execure SQL”任务查询或SSIS SP。或者,您可以在更新语句中使用它来永久更新记录。

作者: Parag 发布者: 27.02.2017 08:07
32x32