2013-08-02 2 views
1

Я ищу помощь в выполнении экспорта данных через запрос SQL Server в плоский файл, который разделен | (трубой).
Я делал это в Sybase SQL без проблем с помощью функции OUTPUT в моем коде:SQL Server: экспорт из файла file.sql в плоский файл

SELECT ItemName 
FROM Products 
WHERE ItemName = 'Gizmo' 
; OUTPUT TO Z:\Export.txt FORMAT ASCII DELIMITED BY '\xA6' 

ли SQL Server имеют такую ​​функцию, и если да, то как она используется?

Update

Я должен уточнить это немного больше. Я хотел бы выполнить этот оператор file.sql с помощью скрипта VB, чтобы сделать ручной процесс автоматическим. Любые функции управления в SQL Server Management Studio не будут работать. xp_cmdshell не является вариантом, так как администратор базы данных этого не допустит.

ответ

4
  1. В SSMS выберите Сервис -> Параметры -> Результаты запроса -> SQL Server -> Результаты в текст
  2. На этой панели выберите формат вывода: разделитель клиента, и введите '|'
  3. Возврат к вашему запросу и выберите Query -> Результаты в файл (Ctrl + Shift + F)
  4. Выполните запрос, вам будет предложено выбрать путь и имя файла

Файл будет сохранен с .rpt расширением, вы можете изменить его в .txt

1

На основе вашего обновления:

Я должен уточнить это немного больше. Я хотел бы выполнить этот оператор file.sql с помощью скрипта VB, чтобы сделать ручной процесс в автоматическом. Любые функции управления в SQL Server Management Studio не будут работать. xp_cmdshell не является вариантом , поскольку администратор базы данных этого не допустит.

Будет ли ваш администратор базы данных позволять использовать SSIS (или инструменты данных) и иметь эту возможность? Если так, вы можете создать задание DATA FLOW в SSIS (или Data Tools), которое будет экспортировать запрос в плоский файл, запросить вызов пакета, а ваш скрипт VB выполнить sp_start_job для выполнения задания, которое вызывает пакет.

1

Мне нужно постоянно экспортировать запросы в flatfiles, так что это мое решение. В основном я создаю процедуру с запросом (не забудьте указать полное имя таблиц), Имя файла, путь Dir в качестве параметров. Значения разделяются символом "|" по умолчанию, но вы можете изменить его.

Не знаю, являются ли это лучшими практиками или нет. Это работает для меня, а безопасность - это не проблема с db, с которой я работаю.

BCP utillity делает трюк почти сам по себе. Перед созданием процедуры обязательно установите правильные разрешения: this и this.

CREATE PROCEDURE [dbo].[export_table] 
@query VARCHAR(8000) 
,@out_file VARCHAR(8000) 
,@out_dir VARCHAR(8000) 
AS 
BEGIN 

    DECLARE @temp NVARCHAR(4000) 
    DECLARE @query_body VARCHAR(8000) 
    DECLARE @header VARCHAR(8000) 
    DECLARE @full_header VARCHAR(8000) 
    DECLARE @copy VARCHAR(8000) 
    DECLARE @del VARCHAR(8000) 
    DECLARE @del1 VARCHAR(8000) 

    -- CREATE AND EXPORT BODY 

    -- drop temp table (when running procedure in same instance) 

    IF OBJECT_ID('tempdb..##temp') IS NOT NULL 
    DROP TABLE ##temp 

    -- populate temp with just 1 line so we can take out the header 

    SET @temp = 'SELECT TOP 1 * INTO ##temp FROM (' + COALESCE(@query,'') + ') a' 

    -- set up the bcp query removing idents so you dont have to write the query in one line 

    SET @query_body = 'bcp "' + COALESCE(@query,'') + '" queryout ' + @out_dir + 'qBody.txt -CACP -T -c -t"|" ' 
    SET @query_body = REPLACE(REPLACE(@query_body, CHAR(13), ' '), CHAR(10), ' ') 
    EXECUTE sp_executesql @temp 
    EXEC master..xp_cmdshell @query_body 

    -- CREATE AND EXPORT HEADER 

    -- set the header using system tables and 
    -- temp table previously created (alias = name) and use bcp to expor the header 

    SELECT @header = 
    COALESCE(@header + ''', ', '') + '''' + name 
    FROM (
     SELECT name 
     FROM tempdb.sys.columns 
     WHERE 
     object_id = object_id('tempdb..##temp') 
    ) b 
    SET @header = @header + '''' 
    SET @full_header = 'bcp "select '+ @header +'" queryout ' + @out_dir + 'qHeader.txt -CACP -T -c -t"|" ' 

    -- COPY NEW FILE FROM HEADER AND BODY AND DELETE USED FILES (USING WINDOWS CMD) 

    SET @copy = 'copy /b "' + @out_dir + 'qHeader.txt" + "' + @out_dir + 'qBody.txt" "' + @out_dir + @out_file + '.txt"' 
    SET @del = 'del "' + @out_dir + 'qHeader.txt"' 
    SET @del1 = 'del "' + @out_dir + 'qBody.txt"' 
    EXEC master..xp_cmdshell @full_header 
    EXEC master..xp_cmdshell @copy 
    EXEC master..xp_cmdshell @del 
    EXEC master..xp_cmdshell @del1 
END 

GO 

-- EXEMAPLE OF USAGE 

exec export_table 
'select 
    column1 
    ,column2 as ''escape_quotes'' 
from cnes.dbo.stg_vinculo' 
,'file_name' 
,'C:\' 
Смежные вопросы