如何将路径传递给存储过程?

时间:2012-05-03 08:07:33

标签: sql-server stored-procedures path

我的问题出在我的标题中,我用以下内容定义了一个存储过程

CREATE PROCEDURE [dbo].[sp_doStuff]   
       @path CHAR(256), @databaseName sysname, @backupType CHAR(1)  
AS  
BEGIN 
   SET NOCOUNT ON;  

   DECLARE @sqlCommand NVARCHAR(1000)  
   DECLARE @dateTime NVARCHAR(20)  

   SELECT @dateTime = REPLACE(CONVERT(VARCHAR, GETDATE(),111),'/','') +  
   REPLACE(CONVERT(VARCHAR, GETDATE(),108),':','')   

   IF @backupType = 'F'  
           SET @sqlCommand = 'BACKUP DATABASE ' + @databaseName +  
           ' TO DISK = ' + @path + @databaseName + '_Full_' + @dateTime + '.BAK'''  

   IF @backupType = 'D'  
           SET @sqlCommand = 'BACKUP DATABASE ' + @databaseName +  
           ' TO DISK = ' + @path + @databaseName + '_Diff_' + @dateTime + '.BAK'' WITH DIFFERENTIAL' 

   IF @backupType = 'L'  
           SET @sqlCommand = 'BACKUP LOG ' + @databaseName +  
           ' TO DISK = ' + @path + @databaseName + '_Log_' + @dateTime + '.TRN'''  

   EXECUTE sp_executesql @sqlCommand  
END

当我想运行以下命令时:

[dbo].[sp_doStuff] 'D:\FolderName\', 'MyDatabase', 'F';

它给了我这个错误:

  

Msg 102,Level 15,State 1,Line 1
  ' D附近语法错误:'。
  消息105,级别15,状态1,行1   字符串后面的未闭合引号&#39; <#39;。

有没有人知道为什么会出错?我可以通过将路径硬编码到过程中来使其工作,但我希望能够在参数中传递它。

2 个答案:

答案 0 :(得分:3)

尝试

' TO DISK = ''' + @path + @databaseName

等...

答案 1 :(得分:1)

这不是参数的问题。你使用单引号做错了执行语句而你还没有转义那个......

你可以使用两个单引号(不是双引号)来逃避单引号。如果用单引号括起来的字符串包含嵌入的引号,则用两个单引号表示嵌入的单引号。

e.g。

USE AdventureWorks
GO
SELECT *
FROM Person.Address
WHERE City = 'Villeneuve-d''Ascq'
GO

价:
   Escape Character in SQL
SQL SERVER – How to Escape Single Quotes – Fix: Error: 105 Unclosed quotation mark after the character string ‘