SQL Server 2016 SQL 代理令牌不起作用

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)

这是一个非常基本的、简单的安装,只有默认实例。

SQL*_*leG 1

如果您在 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)

尝试缩小问题范围