Member 13076177 Ответов: 2

Запуск SQL скрипта с помощью SQLCMD и экспорт в CSV файл


sqlcmd -U xx -P xx -S xxx -Q "select * from sometable" -o D:\output.csv -W -w 1024 -s","


В приведенной выше команде sqlcmd я использую "запятую" в качестве разделителя для разделения столбцов в базе данных и получения выходных данных в формате csv. Но что, если у нас уже есть "запятая" между данными, а не между столбцами? Как изменить приведенное выше утверждение в этом случае?

Ex:

A      B
-----  -----
abc    g,h,i
def    jk,l


Что я уже пробовал:

Попробовал использовать трубу syambol в качестве разделителя (
-s"|"
). Но это не дает вывода в надлежащем формате csv

2 Ответов

Рейтинг:
2

Lynn Nicholson

У меня был похожий вопрос о том, как использовать экспорт SQLCMD в CSV результатов запроса, данные которого могут содержать кавычки и запятые в качестве части выходных данных. Чтобы справиться с необязательными потребностями экранирования и цитирования, я знал, что мой запрос будет слишком длинным для встроенного включения в вызов SQLCMD. Я считаю, что опция-i позволит вам поместить запрос в его собственный файл, но я решил использовать хранимую процедуру.

Я создал следующую пользовательскую скалярную функцию:

USE [MyDatabase]
GO
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
-- =============================================
-- Author:		Lynn Nicholson
-- Create date: 08/16/2018
-- Description:	Prep a value for output to CSV file
-- =============================================
ALTER FUNCTION [dbo].[CSV] 
(
	@text varchar(4000)
)
RETURNS varchar(4000)
AS
BEGIN
	DECLARE @escaped varchar(4000)
	SELECT @escaped = @text
	
	IF (CHARINDEX(',', @text) + CHARINDEX('"', @text)) > 0 -- if our text has a comma or single quote
	BEGIN
		SET @escaped = CONCAT('"', REPLACE(@escaped, '"', '""'), '"')	-- double-up any quotes in the text and surround with quotes.
	END
	
	RETURN @escaped

END


И учитывая этот запрос:
SELECT firstName, lastName, notes FROM client


Вы вызываете функцию prep следующим образом:
SELECT dbo.CSV(firstName) as firstName, dbo.CSV(lastName) as lastName, dbo.CSV(notes) as notes FROM client


"ДБО" - это очень важно.

Используйте на свой страх и риск ymmv и т. д.


Рейтинг:
1

Richard Deeming

То sqlcmd утилита не имеет возможности заключать значения столбцов в кавычки.

Кажется, есть два простых варианта решения этой проблемы:


1) Использование QUOTENAME в вашем запросе, чтобы обернуть значения столбцов в кавычки:

SELECT QUOTENAME(Col1, '"'), ...
SQL-сервера - экспорт данных в формате CSV, используя SQLCMD.EXE - переполнение стека[^]
Ваши значения будут ограничены максимум 128 символами.


2) Используйте Powershell и передавайте результаты из Invoke-SqlCmd в Export-Csv:
файл - как экспортировать данные в формате CSV из SQL Server с помощью sqlcmd? - переполнение стека[^]


Кроме того, вы можете написать свою собственную программу для выполнения запроса и экспортировать результаты в CSV, используя что-то вроде CsvHelper[^] для генерации выходных данных.


Member 13076177

Чтобы заключить значения столбцов в кавычки, мне нужно явно указать имена столбцов. Но, как показано в приведенном выше примере, 'select * from sometable' будет передан в качестве входного запроса. Как заключить имена столбцов, которые содержат запятую внутри кавычек, не упоминая их явно?

Richard Deeming

Ты не можешь. Вам нужно будет либо явно указать список столбцов, либо использовать один из других вариантов.