2017-01-20 7 views
2

Я работаю над экспортом базы данных из SQL Server в Snowflake, и у меня возникла проблема, когда у нас есть и неизвестное количество столбцов с комментариями пользователей и новая строка символов в них. Проблема заключается в том, что в базе данных имеется более 280 таблиц, и я не хочу проходить через каждую таблицу вручную. Мне было интересно, есть ли способ автоматизировать это.Как удалить все новые строковые символы из всех таблиц/столбцов

В настоящее время я использую 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 '%' [email protected] +'%' 
+0

Это будет ужасно медленно сделать это с помощью динамического скрипта на 280 таблицах. Вы, по сути, говорите, что хотите это заменить на каждый столбец каждой строки в каждой таблице. Или это всегда только столбец PR_ITComment? И существует ли она на каждой отдельной таблице, или вам нужно только обновлять таблицы с именем этого столбца? –

+0

Производительность и количество времени, которое требуется для запуска, не является проблемой. Так что да, я ищу динамический скрипт, так как мы точно не знаем, какие столбцы имеют эту проблему, поэтому сценарий, который проходит через каждый столбец на каждой таблице, - это то, что я ищу. – unreal

+0

Btw, как вы экспортируете данные? Если вы можете экспортировать в CSV-кавычки, я верю, что Snowflake должен загрузить его, включая новые строки. –

ответ

0

Это похоже на ответ Шона Ланге, но оно разрешает одно обновление за таблицу вместо одного обновления на столбец.

--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 
+0

Благодаря @SqlZim и Sean Lange это привело меня на правильный трек – unreal

+0

Еще один вопрос, когда я запускаю этот скрипт, похоже, что он не распечатывает все операторы обновления, поскольку выглядит, как последнее утверждение отключается, что ограничивает это? – unreal

+0

@unreal 'print' имеет предел 4000/8000 символов. отредактировал ответ, чтобы использовать 'select'. http://www.sqlservercentral.com/scripts/Print/63240/ – SqlZim

1

Вот один из способов решения этого. Это использует динамический 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 
0

Если вы можете экспортировать данные, используя кавычки (который является стандартным CSV путь), Снежинка может просто загрузить данные с новыми линиями. Вы также можете использовать экранирование, но цитата лучше.

Пример файла с 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  | | 
----+--------+----+ 
0

У меня была такая же проблема при экспорте данных в Excel. Вы можете заменить char (13) и char (10) Используя ''. Это будет работать.

Это простая замена в запросе задачи «Execure SQL» или SP SSIS. Или вы можете использовать его в инструкции обновления для обновления записей навсегда.