我的问题出在我的标题中,我用以下内容定义了一个存储过程
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;。
有没有人知道为什么会出错?我可以通过将路径硬编码到过程中来使其工作,但我希望能够在参数中传递它。
答案 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 ‘