我正在使用 SQL Server Management Studio 2018 我创建了一个存储过程,我想在其中生成 CSV 文件
CREATE PROCEDURE generate_csv_files
AS
BEGIN
SET NOCOUNT ON;
DECLARE @country VARCHAR(MAX);
DECLARE @file_name VARCHAR(MAX);
DECLARE @query VARCHAR(MAX);
DECLARE @bcp_command VARCHAR(MAX);
DECLARE cursor1 CURSOR FOR
SELECT DISTINCT country
FROM Fishery_Landings;
OPEN cursor1;
FETCH NEXT FROM cursor1 INTO @country;
WHILE @@FETCH_STATUS = 0
BEGIN
SET @file_name = 'C:\Users\Erevos\Desktop\' + @country + '.csv';
SET @query = 'SELECT Country, Year, Commodity_Group, MCS.main_commercial_species, presentation, preservation, volume_kg
FROM Fishery_Landings FL
JOIN Commodity_Group CG on FL.CGID = CG.CGID
JOIN Main_Commodity_Species MCS on MCS.MCSID = FL.MCSID
WHERE country = ''' + @country + '''';
SET @bcp_command = 'bcp "' + @query + '" queryout ' + @file_name + ' -c -T -S ' + @@SERVERNAME;
EXEC master..xp_cmdshell @bcp_command;
FETCH NEXT FROM cursor1 INTO @country;
END;
CLOSE cursor1;
DEALLOCATE cursor1;
END;
我得到的错误:
消息 214,级别 16,状态 201,过程 master..xp_cmdshell,第 1 行 [批处理起始行 1] 过程需要类型为“varchar”的参数“command_string”。
我做了什么
EXEC sp_configure '显示高级选项', 1; 重新配置;EXEC sp_configure 'xp_cmdshell', 1; 重新配置;
我该如何绕过这个错误?
将 VARCHAR(MAX) 更改为 VARCHAR(8000) 后更新此错误产生:
用法:bcp {dbtable | 查询} {在 | 出来 | 查询 | format} datafile [-m maxerrors] [-f formatfile] [-e errfile] [-F firstrow] [-L lastrow] [-b batchsize] [-n native type] [-c character type] [-w wide character type] [-N keep non-text native] [-V file format version] [-q quoted identifier] [-C code page specifier] [-t field terminator] [-r row terminator] [-i inputfile] [- o outfile] [-a packetsize] [-S 服务器名称] [-U 用户名] [-P 密码] [-T 可信连接] [-v 版本] [-R 区域启用] [-k 保留空值] [- E 保留标识值][-G Azure Active Directory 身份验证] [-h "加载提示"] [-x 生成 xml 格式文件] [-d 数据库名称] [-K 应用程序意图] [-l 登录超时] NULL
您不能将 varchar(max) 与 xp_cmdshell 一起使用。当你改变
到
它应该工作。
您真正的解决方案是不要使用不安全且难以使用的
xp_cmdshell
. 你最好在 Powershell 中执行此操作。您可以使用支持 Powershell 脚本的 SQL Server 代理按计划执行此操作。