Проблема с одинарными кавычками при создании запроса для утилиты BCP - PullRequest
0 голосов
/ 04 июля 2019

Я застрял в вопросе форматирования строки запроса bcp. Я пропускаю одну цитату где-то и не могу ее найти. Вот мой код:

BEGIN
DECLARE @stmt_c varchar(1000);
DECLARE @Current_Database varchar(1000) = (SELECT DB_NAME());
DECLARE @YYYYMMDD varchar(1000) = (SELECT convert(varchar, GETDATE(), 112));
DECLARE @YYYYMMDDhhmmss varchar(1000) = (SELECT format(getdate(),'yyyyMMddHHmmss'));
DECLARE @location varchar(1000) = 'D:\BackUp 2\Data\';
DECLARE @filename varchar(1000) = 'TGF_'+@YYYYMMDDhhmmss+'_'+@YYYYMMDD+'_'+'TT.dat';
DECLARE @absPath varchar(1000) = @location+@filename;
DECLARE @recordCount varchar(1000) = (SELECT COUNT(1) FROM data_v);
DECLARE @totalBytes varchar(1000) = (SELECT ISNULL(SUM(LEN(result)),0) FROM data_v);
DECLARE @totalItems varchar(1000) = (SELECT COUNT(DISTINCT ITEM_ID) FROM ITEM_TX);
DECLARE @totalChgd varchar(1000) = '0.00000';
DECLARE @trailer varchar(1000) = 'SELECT ''TRAILER''+''|''+@recordCount+''|''+@totalBytes+''|''+@totalChgd+''|''+@totalItems';

SET @stmt_c=
    'BCP '+
     '"SELECT ''HEADER|AA|'+@YYYYMMDDhhmmss+'|'+@YYYYMMDD+'|1.0'' UNION ALL SELECT * FROM data_v UNION ALL '+ @trailer" '+
    'QUERYOUT "'+@absPath+'" '+
    '-c -t, -T -d ' + @Current_Database;
EXEC master.sys.xp_cmdshell @stmt_c;

END 

Приведенный выше код дает мне следующую ошибку:

Incorrect syntax near ' '+
    'QUERYOUT '.
Msg 105, Level 15, State 1, Line 18
Unclosed quotation mark after the character string ' '+
    '-c -t, -T -d ' + @Current_Database;
EXEC master.sys.xp_cmdshell @stmt_c;

END 
'.

Я хочу экспортировать набор результатов следующего запроса:

SELECT 'HEADER|AA|'+@YYYYMMDDhhmmss+'|'+@YYYYMMDD+'|1.0' UNION ALL SELECT * FROM data_v UNION ALL SELECT 'TRAILER|'+@recordCount+'|'+@totalBytes+'|'+@totalChgdPrem+'|'+@totalPolicies

Я не могу добавить запрос трейлера в мой код.

Ответы [ 2 ]

0 голосов
/ 04 июля 2019

Я исправил проблему.

Прокомментировал переменную @trailer.

-- DECLARE @trailer varchar(1000) = 'SELECT ''TRAILER''+''|''+@recordCount+''|''+@totalBytes+''|''+@totalChgd+''|''+@totalItems';

Изменена строка запроса:

'"SELECT ''HEADER|AA|'+@YYYYMMDDhhmmss+'|'+@YYYYMMDD+'|1.0'' UNION ALL SELECT * FROM data_v UNION ALL SELECT ''TRAILER|'+@recordCount+'|'+@totalBytes+'|'+@totalChgd+'|'+@totalItems+'''" '
0 голосов
/ 04 июля 2019

Теперь мне удалось распечатать строку. Я отредактировал оператор, в котором вы извлекаете данные из таблицы "data_v" (к которой у меня нет доступа), чтобы она работала на моем конце. В конце концов он должен работать с оригинальным кодом.

Теперь он также выполнит другие операторы.

Пожалуйста, попробуйте это:

    BEGIN
DECLARE @stmt_c varchar(1000);
DECLARE @Current_Database varchar(1000) = (SELECT DB_NAME());
DECLARE @YYYYMMDD varchar(1000) = (SELECT convert(varchar, GETDATE(), 112));
DECLARE @YYYYMMDDhhmmss varchar(1000) = (SELECT format(getdate(),'yyyyMMddHHmmss'));
DECLARE @location varchar(1000) = 'D:\BackUp 2\Data\';
DECLARE @filename varchar(1000) = 'TGF_'+@YYYYMMDDhhmmss+'_'+@YYYYMMDD+'_'+'TT.dat';
DECLARE @absPath varchar(1000) = @location+@filename;
DECLARE @recordCount varchar(1000) = (SELECT '369' as col);
DECLARE @totalBytes varchar(1000) = (SELECT '674' as col);
DECLARE @totalItems varchar(1000) = (SELECT '14' as col);
DECLARE @totalChgd varchar(1000) = '0.00000';
DECLARE @trailer varchar(1000) = 'SELECT ''TRAILER|'+@recordCount+'|'+@totalBytes+'|'+@totalChgd+'|'+@totalItems;

SET @stmt_c=
    'BCP '+
        '"SELECT ''HEADER|AA|'+@YYYYMMDDhhmmss+'|'+@YYYYMMDD+'|1.0'' UNION ALL SELECT * FROM data_v UNION ALL '+ @trailer+'" '+
    'QUERYOUT "'+@absPath+'" '+
    '-c -t, -T -d ' + @Current_Database;
print @stmt_c

--EXEC master.sys.xp_cmdshell @stmt_c;

END 

Вот результат на моем конце:

BCP "SELECT 'HEADER|AA|20190705154946|20190705|1.0' UNION ALL SELECT * FROM data_v UNION ALL SELECT 'TRAILER|369|674|0.00000|14" QUERYOUT "D:\BackUp 2\Data\TGF_20190705154946_20190705_TT.dat" -c -t, -T -d master

редактирование: Как вы упомянули, что вы решили проблему, было бы лучше дополнить этот вопрос вашим решением или, если вы не хотите этого, удалите весь вопрос.

...