0

変数名からデータベースを作成し、新しく作成されたデータベースを取得して .bak ファイルから復元する SQL スクリプトをセットアップしています。セットアップ中のコマンドの 1 つで構文に問題があり、構文エラーを見つけるのを手伝ってくれる人がいるかどうか尋ねたいと思いましたか? 問題のあるコードのスニペットとその宣言のみを貼り付けます。正しい場合、問題はファイル名パスを宣言する方法にあります。パスを変数に設定しようとしましたが、アポストロフィの配置が原因でエラーが発生しました。ありがとう!!!

declare @DBname varchar(10), @sqlcommand Nvarchar(max)
set @DBname = 'testdb'

データベースを作成し、新しいデータベースをシングル ユーザー モードに設定するコード

--restore database
set @sqlcommand = N'Restore DATAbase ' + @DBname + ' from disk = ''C:/loc_smartz_db0_template.bak'' with move ' 
+ @DBname + ' to ''C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'', move ' +     @DBname + ' to ''C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.ldf'', Replace'
EXECUTE sp_executesql @sqlcommand 

データベースをマルチユーザーに戻し、データベースが正常に作成されたことを出力するコード

4

2 に答える 2

2

以前の投稿者が問題を解決したように見えますが、「ベスト プラクティス」の方法で動的 SQL を使用していた場合、これは回避された可能性があります。変数と文字列リテラルの混合物として文字列を連結することは、アポストロフィの使用が困難になるため理想的ではありません (ここに示すように)。

より良い方法は、SQLを次のように書くことです

declare @DBname nvarchar(255) = 'testdb'
        ,@BakName nvarchar(255) = 'C:\loc_smartz_db0_template.bak'
        ,@MovemdfName nvarchar(255) = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDatabase1.mdf'
        ,@MoveldfName nvarchar(255) = 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDatabase1.ldf'
        ,@sqlcommand nvarchar(max)
        ,@paramList nvarchar(max)

set @paramList = '@DBname nvarchar(255), @BakName nvarchar(255), @MovemdfName nvarchar(255), @MoveldfName nvarchar(255)'
set @sqlcommand = N'Restore DATAbase @DBname from disk = @BakName with move @DBname to @MovemdfName, move @DBname to @MoveldfName, Replace'

exec sp_executesql @statement = @sqlcommand
                  ,@params = @paramList
                  ,@DBname = @DBname
                  ,@BakName = @BakName 
                  ,@MovemdfName  = @MovemdfName 
                  ,@MoveldfName = @MoveldfName 

このように、SQL コマンドは非常に読みやすく、維持しやすいものです。パス名にスペースが含まれている場合でも、変数値のアポストロフィをエスケープする必要はありません。

また、(ストアド プロシージャにコードがある場合) SQL Server がパフォーマンスを向上させる実行プランを再利用できるという利点もあります。

詳しくはこちらをご覧ください。

于 2012-07-26T00:39:19.667 に答える
1

2つのこと。

まず、データベース ファイルの論理名を一重引用符で囲む必要があります。

から

...with move testdb to 'C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'

...with move 'testdb' to 'C:/ProgramFiles/Microsoft SQL Server/MSSQL/Data/TestDatabase1.mdf'

それを作る

set @sqlcommand = N'Restore DATAbase ' + @DBname + ' from disk = ''C:\loc_smartz_db0_template.bak'' with move ''' 
 + @DBname + ''' to ''C:\ProgramFiles\Microsoft SQL Server\MSSQL\Data\TestDatabase1.mdf'', move '''
 + @DBname + ''' to ''C:\ProgramFiles\Microsoft SQL Server\MSSQL\Data\TestDatabase1.ldf'', Replace'

次に、スラッシュ\ではなくバックスラッシュを使用します。(おそらくこれは機能しますが、私の簡単なテストでは機能しませんでした。)

于 2012-07-25T23:00:07.207 に答える