为 BCP 实用程序创建查询时出现单引号问题
Single quote issue while creating the query for BCP utility
我遇到了 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
我无法在我的代码中附加预告片查询。
我现在可以打印出字符串了。
我已经编辑了您从 table "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
编辑:
正如你所提到的,你已经解决了这个问题,最好用你的解决方案来增强这个问题,或者如果你不想,请删除整个问题。
我解决了这个问题。
注释了@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+'''" '
我遇到了 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
我无法在我的代码中附加预告片查询。
我现在可以打印出字符串了。 我已经编辑了您从 table "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
编辑: 正如你所提到的,你已经解决了这个问题,最好用你的解决方案来增强这个问题,或者如果你不想,请删除整个问题。
我解决了这个问题。
注释了@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+'''" '