Sql 在标量变量周围添加单引号

Sql 在标量变量周围添加单引号,sql,sql-server,Sql,Sql Server,我有一个存储过程,试图在其中执行一个@cmd变量,它是一个备份数据库命令。当我运行存储过程(通过reporting agent在作业中)时,我认为路径中的“C:”有一个错误,因为路径没有用引号括起来。如何封装@Filename变量?我必须在其周围加引号,这样数据库备份命令才能工作 以下是存储过程的代码: CREATE PROCEDURE pAgentBackup AS --1. Declare Variables. DECLARE @MaxID INT DECLARE @MinID INT DE

我有一个存储过程,试图在其中执行一个@cmd变量,它是一个备份数据库命令。当我运行存储过程(通过reporting agent在作业中)时,我认为路径中的“C:”有一个错误,因为路径没有用引号括起来。如何封装@Filename变量?我必须在其周围加引号,这样数据库备份命令才能工作

以下是存储过程的代码:

CREATE PROCEDURE pAgentBackup
AS
--1. Declare Variables.
DECLARE @MaxID INT
DECLARE @MinID INT
DECLARE @CurrentID INT
DECLARE @Path VARCHAR(100)
DECLARE @DBName VARCHAR(50)
DECLARE @Type CHAR(1)
DECLARE @cmd VARCHAR(500)
DECLARE @Recovery VARCHAR(300)
DECLARE @Filename VARCHAR(100)

SELECT @CurrentID = 0, @MaxID = MAX(BKID) FROM DBBackups

--2. Loop through the columns in the table and execute the backups.
WHILE @CurrentID < @MaxID
    BEGIN
        SELECT @CurrentID = MIN(BKID) FROM DBBackups WHERE BKID > @CurrentID

        SELECT @DBName = DbName FROM DBBackups WHERE BKID = @CurrentID
        SELECT @Path = Path FROM DBBackups WHERE BKID = @CurrentID
        SELECT @Type = Type FROM DBBackups WHERE BKID = @CurrentID

        IF @Type = 'F'
            BEGIN
                SELECT @Recovery = CAST(DATABASEPROPERTYEX(name, 'Recovery') AS VARCHAR(25))
                FROM master.dbo.sysdatabases WHERE name = @DBName

                --Set recovery to full if it is not already turned on.
                IF @Recovery <> 'FULL'
                    BEGIN
                        SELECT @cmd = 'ALTER DATABASE ' + @DBName + ' SET RECOVERY FULL'
                        EXEC (@cmd)
                    END

                --BEGIN Backup
                SET @Filename = @Path + @DBName + 'Full' +  CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak'
                SET @cmd = 'BACKUP DATABASE ' + @DBName + ' TO DISK = ' + @Filename
                EXEC (@cmd)

                SET @Filename = @Path + '\Log' + @DBName + 'Log' +  CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak'
                SET @cmd = 'BACKUP LOG ' + @DBName + ' TO DISK = ' + @Filename
                EXEC (@cmd)
            END

        IF @Type = 'L'
            BEGIN
                SELECT @Recovery = CAST(DATABASEPROPERTYEX(name, 'Recovery') AS VARCHAR(25))
                FROM master.dbo.sysdatabases WHERE name = @DBName

                --Set recovery to full if it is not already turned on.
                IF @Recovery <> 'FULL'
                    BEGIN
                        SELECT @cmd = 'ALTER DATABASE ' + @DBName + ' SET RECOVERY FULL'
                        EXEC (@cmd)
                    END

                --Begin Backup
                SET @Filename = @Path + '\Log' + @DBName + 'Log' +  CONVERT(VARCHAR(8), GETDATE(), 112) + '.bak'
                SET @cmd = 'BACKUP LOG ' + @DBName + ' TO DISK = ' + @Filename
                EXEC (@cmd)
            END
    END
GO
创建过程页面备份
作为
--1. 声明变量。
声明@MaxID INT
声明@MinID INT
声明@CurrentID INT
声明@Path VARCHAR(100)
声明@DBName VARCHAR(50)
声明@Type CHAR(1)
声明@cmd VARCHAR(500)
声明@Recovery VARCHAR(300)
声明@Filename VARCHAR(100)
从DBBackups中选择@CurrentID=0、@MaxID=MAX(BKID)
--2. 循环表中的列并执行备份。
而@CurrentID<@MaxID
开始
从DBBackups中选择@CurrentID=MIN(BKID),其中BKID>@CurrentID
从DBBackups中选择@DBName=DBName,其中BKID=@CurrentID
从DBBackups中选择@Path=Path,其中BKID=@CurrentID
从DBBackups中选择@Type=Type,其中BKID=@CurrentID
如果@Type='F'
开始
选择@Recovery=CAST(DATABASEPROPERTYEX(名称“Recovery”)作为VARCHAR(25))
来自master.dbo.sysdatabases,其中name=@DBName
--如果尚未打开,请将恢复设置为“完全”。
如果@Recovery“FULL”
开始
选择@cmd='alterdatabase'+@DBName+'SET RECOVERY FULL'
EXEC(@cmd)
结束
--开始备份
SET@Filename=@Path+@DBName+'Full'+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak'
将@cmd='BACKUP DATABASE'+@DBName+'设置为DISK='+@Filename
EXEC(@cmd)
设置@Filename=@Path+'\Log'+@DBName+'Log'+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak'
将@cmd='BACKUP LOG'+@DBName+'设置为DISK='+@Filename
EXEC(@cmd)
结束
如果@Type='L'
开始
选择@Recovery=CAST(DATABASEPROPERTYEX(名称“Recovery”)作为VARCHAR(25))
来自master.dbo.sysdatabases,其中name=@DBName
--如果尚未打开,请将恢复设置为“完全”。
如果@Recovery“FULL”
开始
选择@cmd='alterdatabase'+@DBName+'SET RECOVERY FULL'
EXEC(@cmd)
结束
--开始备份
设置@Filename=@Path+'\Log'+@DBName+'Log'+CONVERT(VARCHAR(8),GETDATE(),112)+'.bak'
将@cmd='BACKUP LOG'+@DBName+'设置为DISK='+@Filename
EXEC(@cmd)
结束
结束
去
更换

SET @cmd = 'BACKUP LOG ' + @DBName + ' TO DISK = ' + @Filename


将您的查询更改为

 SET @cmd = 'BACKUP DATABASE ' + @DBName + ' TO DISK = ''' + @Filename + ''''

还要更改SP中使用@Filename变量的所有查询。

我认为
替换
+
QUOTENAME
使查询更易于阅读和维护

SET @cmd = '
  BACKUP DATABASE @DBName 
  TO DISK = @Filename
';

SET @cmd = REPLACE(@cmd, '@DBName', QUOTENAME(@DBName));
SET @cmd = REPLACE(@cmd, '@Filename', QUOTENAME(@Filename, ''''));

为了测试你的理论,只需在适当的地方添加
set@filename=''''''+@filename+''''''.
。这将把原来的
文件
更改为
文件
SET @cmd = '
  BACKUP DATABASE @DBName 
  TO DISK = @Filename
';

SET @cmd = REPLACE(@cmd, '@DBName', QUOTENAME(@DBName));
SET @cmd = REPLACE(@cmd, '@Filename', QUOTENAME(@Filename, ''''));