Использование xp_cmdshell для экспорта всех таблиц в отдельные текстовые файлы

Я пытаюсь экспортировать некоторые данные из одной из моих баз данных SQL Server. В нем чуть более 300 таблиц, и я не видел способа экспортировать эти данные с помощью мастера SSMS, поскольку он обрабатывает только одну таблицу за раз. Мне нужно использовать разделитель "/". Так что я поиграл с xp_cmdshell, и он, кажется, делает почти все, что мне нужно, кроме одной вещи.

Мне нужно, чтобы он просто выводил имя таблицы следующим образом: table1.txt, где сейчас он выводится как [dbo].[Table1].txt

Execute sp_MSforeachtable 'Execute master.dbo.xp_cmdshell ''sqlcmd -S SERVER\INSTANCE -E -d DB -q "SET NOCOUNT ON SELECT * FROM ?"''' -W -h-1 -o C:\DBA\?.txt -s "/"'''

3 ответа

Вы можете сделать это с помощью курсора и команды bcp.

use YOURDB;
declare @tablename varchar(50), @schemaId int
declare c cursor for 
select name, [schema_id] from sys.tables where type = 'U' and is_ms_shipped = 0
open c
fetch next from c into @tablename, @schemaId
while @@FETCH_STATUS = 0
begin
declare @query varchar(1000) = 'bcp '+quotename(schema_name(@schemaId))+'.'+
quotename(@tablename)+' out C:\DBA\'+@tablename+'.txt -S SERVER\INSTANCE -d YOURDB -T -c'
exec xp_cmdshell @query, no_output;
fetch next from c into @dtableame, @schemaId
end
close c
deallocate c

Попробуй это:

exec sp_MSforeachtable 'declare @query varchar(8000)=''sqlcmd -q "set nocount on;select * from ?" -o "''+''C:\DBA\''+replace(substring(''?'',charindex (''.'',''?'')+2,len(''?'')-1),'']'','''')+''.txt"'';
                            exec xp_cmdshell @query'

Вот один трюк, чтобы сделать это

EXECUTE sp_MSforeachtable 'select ''?'' as org_string,replace(replace(''?'',''[dbo].['',''''),'']'','''') as result_string'

Вы должны добавить вышеупомянутую логику в свой код.

Примечание: если имя вашей таблицы имеет [dbo].[ или же ] символы в этом то это может испортить

Другие вопросы по тегам