首页 > 解决方案 > SQL 代理弄乱了连接字符串中的特殊字符

问题描述

我正在导出到一个平面文件,该文件位于一个路径中,不幸的是它的名称中包含德语特殊字符“ß”。

这在 Visual Studio 中可以正常工作,但从部署的包中我得到一个找不到路径的错误。代理的错误日志中提到了路径本身,但在“ß”处搞砸了。我已经断言这不是文件系统授权问题。我还尝试通过使用 (DT_WSTR) 进行转换来确保保存路径的变量值是 unicode。

奇怪的是,该解决方案以前一直没有问题。突然间,它遇到了这个错误。我不确定是否在服务器上应用了任何更改,但我不这么认为。

标签: sql-serverssissql-agent-job

解决方案


它对我有用,所以你的情况可能有其他问题。

我创建了一个简单的 SSIS 包,它导出到具有当前日期的平面文件。

在此处输入图像描述

我创建了一个包级别参数ExtractFile并将其指向 C:\ssisdata\so\output\so_67284139.txt 的非德语命名路径

平面文件连接管理器上有一个 f(x) glpyh,因为我在 ConnectionString 上定义了一个表达式作为 PackageParameter ExtractFile。这允许我在运行时更改导出路径。

我创造了两个工作。一个按原样运行包,另一个导出到 eszett *路径。

没有德国工作

DECLARE @ReturnCode int;
DECLARE @jobId binary(16);
EXEC @ReturnCode = msdb.dbo.sp_add_job
    @job_name = N'NoGermans'
,   @enabled = 1
,   @notify_level_eventlog = 0
,   @notify_level_email = 0
,   @notify_level_netsend = 0
,   @notify_level_page = 0
,   @delete_level = 0
,   @description = N'No description available.'
,   @category_name = N'[Uncategorized (Local)]'
,   @owner_login_name = N'sa'
,   @job_id = @jobId OUTPUT;

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
    @job_id = @jobId
,   @step_name = N'Run package'
,   @step_id = 1
,   @cmdexec_success_code = 0
,   @on_success_action = 1
,   @on_success_step_id = 0
,   @on_fail_action = 2
,   @on_fail_step_id = 0
,   @retry_attempts = 0
,   @retry_interval = 0
,   @os_run_priority = 0
,   @subsystem = N'SSIS'
,   @command = N'/ISSERVER "\"\SSISDB\So\SO_German\SO_67284139.dtsx\"" /SERVER "\".\dev2017\"" /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
,   @database_name = N'master'
,   @flags = 0;

是的德国工作 - 相关部分是参数的分配,如/Par ExtractFile;"\"C:\ssisdata\so\output\so_67284139_ß\so_67284139.txt\"

DECLARE @ReturnCode int;
DECLARE @jobId binary(16);
EXEC @ReturnCode = msdb.dbo.sp_add_job
    @job_name = N'ZeeGermans'
,   @enabled = 1
,   @notify_level_eventlog = 0
,   @notify_level_email = 0
,   @notify_level_netsend = 0
,   @notify_level_page = 0
,   @delete_level = 0
,   @description = N'No description available.'
,   @category_name = N'[Uncategorized (Local)]'
,   @owner_login_name = N'sa'
,   @job_id = @jobId OUTPUT;

EXEC @ReturnCode = msdb.dbo.sp_add_jobstep
    @job_id = @jobId
,   @step_name = N'Run package'
,   @step_id = 1
,   @cmdexec_success_code = 0
,   @on_success_action = 1
,   @on_success_step_id = 0
,   @on_fail_action = 2
,   @on_fail_step_id = 0
,   @retry_attempts = 0
,   @retry_interval = 0
,   @os_run_priority = 0
,   @subsystem = N'SSIS'
,   @command = N'/ISSERVER "\"\SSISDB\So\SO_German\SO_67284139.dtsx\"" /SERVER "\".\dev2017\"" /Par ExtractFile;"\"C:\ssisdata\so\output\so_67284139_ß\so_67284139.txt\"" /Par "\"$ServerOption::LOGGING_LEVEL(Int16)\"";1 /Par "\"$ServerOption::SYNCHRONIZED(Boolean)\"";True /CALLERINFO SQLAGENT /REPORTING E'
,   @database_name = N'master'
,   @flags = 0;

两个作业都按预期运行并创建了文件

C:\ssisdata\so\output>dir /s *.txt
 Volume in drive C has no label.
 Volume Serial Number is 3AB8-1C01

 Directory of C:\ssisdata\so\output

04/27/2021  10:01 AM                39 so_67284139.txt
               1 File(s)             39 bytes

 Directory of C:\ssisdata\so\output\so_67284139_ß

04/27/2021  10:01 AM                39 so_67284139.txt
               1 File(s)             39 bytes

我最好的猜测是,您的某些设置或执行正在使用路径的 varchar 数据类型而不是 nvarchar,但我们需要查看包的内容和您的 SQL 代理作业定义。或者你可以反对我的复制品

*也许我应该称它为 sharfes?Ich spreche kein Deutsch。


推荐阅读