the*_*eog 5 sql-server sqlcmd sql-server-agent sql-server-2016
我在整个企业的许多 SQL 代理作业步骤中都有这个,并且它按预期工作:
sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "EXECUTE MyStoredProc etc..."
Run Code Online (Sandbox Code Playgroud)
但是在我的新 SQL Server 2016 实例上,它只会产生一个命名管道连接错误(这是一个完全的红鲱鱼)。
另一方面,这在我的新服务器上运行良好:
sqlcmd -E -S MyExplicitServerName -d master -Q "EXECUTE MyStoredProc etc..."
Run Code Online (Sandbox Code Playgroud)
为什么 SRVR 令牌不起作用?
如果我在命令提示符下启动 sqlcmd 并告诉它打印$(ESCAPE_SQUOTE(SRVR))它说:
'SRVR' scripting vaiable not defined.
Run Code Online (Sandbox Code Playgroud)
这是一个非常基本的、简单的安装,只有默认实例。
如果您在 SSMS 中打开新选项卡并切换到 sqlcmd,则该命令是正常的
print $(ESCAPE_SQUOTE(SRVR))
不起作用,因为 $(variable) 是在 sqlcmd 中使用变量的语法,因此会出现错误消息。
请注意,令牌只能在 SQL 代理范围内使用。
https://learn.microsoft.com/en-us/sql/ssms/agent/use-tokens-in-job-steps?view=sql-server-2017
我尝试在我方便的两个实例(SQL2014 和 SQL2016)中重现您的错误,并且我创建了以下作业,该作业在两个版本上都运行良好
USE [msdb]
GO
/****** Object: Job [token test] Script Date: 14/06/2018 21:14:35 ******/
BEGIN TRANSACTION
DECLARE @ReturnCode INT
SELECT @ReturnCode = 0
/****** Object: JobCategory [[Uncategorized (Local)]] Script Date: 14/06/2018 21:14:35 ******/
IF NOT EXISTS (SELECT name FROM msdb.dbo.syscategories WHERE name=N'[Uncategorized (Local)]' AND category_class=1)
BEGIN
EXEC @ReturnCode = msdb.dbo.sp_add_category @class=N'JOB', @type=N'LOCAL', @name=N'[Uncategorized (Local)]'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
END
DECLARE @jobId BINARY(16)
EXEC @ReturnCode = msdb.dbo.sp_add_job @job_name=N'token test',
@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
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
/****** Object: Step [step1] Script Date: 14/06/2018 21:14:35 ******/
EXEC @ReturnCode = msdb.dbo.sp_add_jobstep @job_id=@jobId, @step_name=N'step1',
@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'CmdExec',
@command=N'sqlcmd -E -S $(ESCAPE_SQUOTE(SRVR)) -d master -Q "SELECT @@servername"
',
@flags=0
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_update_job @job_id = @jobId, @start_step_id = 1
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
EXEC @ReturnCode = msdb.dbo.sp_add_jobserver @job_id = @jobId, @server_name = N'(local)'
IF (@@ERROR <> 0 OR @ReturnCode <> 0) GOTO QuitWithRollback
COMMIT TRANSACTION
GOTO EndSave
QuitWithRollback:
IF (@@TRANCOUNT > 0) ROLLBACK TRANSACTION
EndSave:
GO
Run Code Online (Sandbox Code Playgroud)
所以它一定是别的东西,因为 SQL2016 在这个特定问题上的行为就像以前的版本一样。
/******** 编辑 ****************/
我已经在运行 Win Server 2016 - SQL Server 2017 标准版的计算机中创建了上述 SQL 代理作业,并且它运行良好,正如我之前指出的,也许值得尝试一些简单的操作,例如
SELECT @@SERVERNAME
Run Code Online (Sandbox Code Playgroud)
尝试缩小问题范围
| 归档时间: |
|
| 查看次数: |
2240 次 |
| 最近记录: |