Sql server 使用内联参数计算调用存储过程时出现TSQL错误
我正在尝试将一些oracle转换为SQL Server,但调用存储过程时遇到问题。以下电话:Sql server 使用内联参数计算调用存储过程时出现TSQL错误,sql-server,Sql Server,我正在尝试将一些oracle转换为SQL Server,但调用存储过程时遇到问题。以下电话: Exec VEO_ADD_EVENT_NOTE p_DIVCODE, p_IncidentRef, p_UserID, 'A', format(getdate(),'dd/MM/yyyy HH:mm') +
Exec VEO_ADD_EVENT_NOTE p_DIVCODE,
p_IncidentRef,
p_UserID, 'A',
format(getdate(),'dd/MM/yyyy HH:mm') +
' ' + Logged_FName +
' ' + Logged_LName + char(10) +
'Template changed.';
产生此错误
Msg 102,15级,状态1,服务器TRAC-LEEDS-11,第1行“getdate”附近的语法不正确
发生了什么事?在这件事上胡闹了一段时间后,我意识到 在sql server中,不能使用内联参数计算调用过程 我真的希望一些文档能用粗体大写字母告诉你这一点
作为一个来自非sql语言、没有那么多怪癖的人,这类事情令人困惑 如果我将代码更改为:
declare @text nvarchar(Max)
set @text = format(getdate(), 'dd/MM/yyyy HH:mm') + ' ' + Logged_FName + ' ' + Logged_LName + char(10) + 'Template changed.';
Exec VEO_ADD_EVENT_NOTE p_DIVCODE, p_IncidentRef, p_CompassUserID, 'A', @text
然后,我开始得到其他更预期的错误:
Msg 207, Level 16, State 1, Server TRAC-LEEDS-11, Line 2
Invalid column name 'Logged_FName'.
Msg 207, Level 16, State 1, Server TRAC-LEEDS-11, Line 2
Invalid column name 'Logged_LName'.
请注意,这实际上意味着您需要一个“@”。另一条高质量错误消息您能显示过程定义吗?@Raj您的编辑已经搞乱了代码和错误消息之间的关系。如何?滚动阅读并理解一行代码是很困难的。我没有更改您的代码,是吗?@Raj我可以理解,但我认为错误现在出现在第4行而不是第一行,因为错误消息saysIt在文档中有详细说明,但可能不是以明显的方式。我曾多次希望为SQL Server文档提供“如何阅读此文档”,但它目前不存在。比较并注意,
SELECT
允许显示表达式,它几乎可以是任意的,EXEC
只有value、@variable或DEFAULT选项,并且每个选项都是严格定义的。至少关于无效列名的部分非常明显,由于变量名需要以@
开头,而Logged\u FName
不需要,SQL引擎认为它必须是一个列,而不是一个列。这样就出现了错误。@ThorstenDittmar我想除了你还必须记住,当你声明一个变量作为游标时,它不能有@JonnyLeeds,你对游标的看法是正确的。但我一直认为可能有一个@
,但不需要一个?让我进一步用它来迷惑你。不带@
的参数被解释为字符串。