调用简单存储过程以创建文本日志文件时出错

时间:2016-10-31 12:03:31

标签: sql sql-server stored-procedures

我创建了一个存储过程来将文本写入日志文件。

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'

附近的语法不正确

我一定错过了一些明显的东西......任何想法?

1 个答案:

答案 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