2017-09-26 6 views
0

現在の日付時刻を使用してデータベースをバックアップして、固有のファイル名を作成しようとしています。現在の日付のSQL Serverデータベースをバックアップ

私は@TimeDate

前に「+」にマイコード間違った構文を得続ける:

ALTER PROCEDURE [dbo].[BackUpDatabase] 
(@DatabaseName Varchar(256)) 
AS 
Begin 
DECLARE @TimeDate Varchar(256); 
SET @TimeDate = CONVERT(Varchar(256),GETDATE(), 113); 
BACKUP DATABASE @DatabaseName 
TO DISK = 'C:\SQLEXPRESSBACKUP\DB'+ @TimeDate + '.bak' 
WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10 
END 

をそして私は私が間違っているのかを知るために、上の検索するには何を把握することができませんか。

あなたはかなりの変数に追加しようとするよりも、クエリを構築するために、動的SQLを使用する必要があります

答えて

1

まず、あなたの@TimeDate値が生成何を見て:

DECLARE @TimeDate Varchar(256); 
SET @TimeDate = CONVERT(Varchar(256),GETDATE(), 113); 
SELECT @TimeDate 

が生成されますに追加するとき

26 Sep 2017 11:49:07:650 

は、これは許容可能なファイル名ではないでしょう、あなたの文字列。したがって、これを浄化して:文字を削除する必要があります。

TO DISK = 'C:\SQLEXPRESSBACKUP\DB'+ @TimeDate + '.bak' 

変更するには:

DECLARE @location VARCHAR(100) = 'C:\SQLEXPRESSBACKUP\DB' + @timedate + '.bak' 

全soution

SET @TimeDate = REPLACE(CONVERT(Varchar(256),GETDATE(), 126), ':',''); 

第二に、それはあなたが前に準備することができ代わりに変数を使用するので、あなたはここに文字列を連結好きではありません。 :

DECLARE @TimeDate Varchar(256); 
SET @TimeDate = REPLACE(CONVERT(Varchar(256),GETDATE(), 126), ':',''); 
DECLARE @location VARCHAR(100) = 'C:\SQLEXPRESSBACKUP\DB' + @timedate + '.bak' 
BACKUP DATABASE @DatabaseName 
TO DISK = @location 
WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10 
+0

はい、私はそれを見つけました、本当に良い答え!だから私が本当に必要なのは、それを保存するために@location変数を作ることでしたか? – andrelange91

+0

はい、バックアップコマンドを呼び出す前に場所を構築することができます。 – Tanner

+1

また、 ':'文字をタイムアウトから削除するために使用される 'REPLACE'にも注意してください。 – Tanner

0

ALTER PROCEDURE [dbo].[BackUpDatabase](@DatabaseName VARCHAR(256)) 
AS 
    BEGIN 
     DECLARE @TimeDate VARCHAR(256); 
     SET @TimeDate = CONVERT(VARCHAR(256), GETDATE(), 113); 
     DECLARE @sql VARCHAR(MAX); 
     SET @sql = ' 
BACKUP DATABASE ['[email protected]me+'] 
TO DISK = ''C:\SQLEXPRESSBACKUP\DB'[email protected]+'.bak'' 
WITH NOFORMAT, INIT, NAME= '''[email protected]+''', SKIP, NOREWIND, NOUNLOAD, STATS=10'; 
     PRINT @sql; 
--exec (@sql) 
    END; 

PRINT @SQLは、あなたがそれに満足している場合は、実行するために何が起こっているかを紹介しますそれを削除してコメントを外します。exec (@sql)

+0

プロシージャを実行しようとすると、このエラーが発生します: 'with'というキーワードの近くに構文が正しくありません。この文が共通テーブル式、xmlnamespaces句または変更追跡コンテキスト句である場合、前の文はセミコロンで終了する必要があります。 – andrelange91

+0

@ andrelange91私の悪い - 偶然に余分な引用符を追加しました、それを変更しました – dbajtr

1

変数@ExecuteQueryを宣言し、この変数値をTO DISKに割り当てることができます。

このようにします。すべての

DECLARE @ExecuteQuery Varchar(1000); 
SET @ExecuteQuery = 'C:\SQLEXPRESSBACKUP\DB' + CONVERT(Varchar(256),GETDATE(), 113) + '.bak' 
BACKUP DATABASE @DatabaseName 
TO DISK = @ExecuteQuery 
WITH NOFORMAT, INIT, NAME= @DatabaseName, SKIP, NOREWIND, NOUNLOAD, STATS=10 
+0

これは働いた^^ありがとうございます。 – andrelange91

+0

@ andrelange91このコードは 'GETDATE()'によって生成された ':'文字で実際に動作しましたが、テストしてもそれはできませんでした。 – Tanner

+0

いいえ:では動作しませんでしたが、他はすべて動作しました。私は今までそれを理解していなかった。それは問題だった。 – andrelange91

関連する問題