Использование 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].[
или же ]
символы в этом то это может испортить