我创建了一个存储过程来将文本写入日志文件。
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[WriteTextFileLog]
@TextForLog nvarchar(MAX)
AS
DECLARE @CMDTEXT as nvarchar(255)
SELECT @CMDTEXT = 'echo ' + @TextForLog + ' >> "\\pathtotextfile\LogFile.txt"'
EXEC master..xp_cmdshell @CMDTEXT;
当我这样称呼时:
MYDATABASE.dbo.writetextfilelog @TextForLog = CONVERT(varchar(23), GETDATE, 121)
我收到此错误:
关键字' CONVERT'
附近的语法不正确
我一定错过了一些明显的东西......任何想法?
答案 0 :(得分:1)
正如@marc_s在评论中所说,EXECUTE
不接受表达式作为参数值,只接受普通常量字符串或变量或DEFAULT
关键字。
以下是调用存储过程的命令语法:
[ { EXEC | EXECUTE } ] { [ @return_status = ] { module_name [ ;number ] | @module_name_var } [ [ @parameter = ] { value | @variable [ OUTPUT ] | [ DEFAULT ] } ] [ ,...n ] [ WITH <execute_option> [ ,...n ] ] } [;]
因此,请在变量中预先准备参数的值:
DECLARE @VarText nvarchar(max);
SET @VarText = N'Blah blah test ' + CONVERT(varchar(23), GETDATE(), 121);
EXEC MYDATABASE.dbo.writetextfilelog @TextForLog = @VarText;
我建议您谨慎使用nvarchar(max)
,只有在您真正需要超过4000个字符时才能使用nvarchar(255)
。否则使用合理的限制,例如using namespace std
。