0

次のようなt-sqlステートメントのセットがあります。

DECLARE @somefilepath as nvarchar = 'c:\somedir\somefile.ext';
DECLARE @anotherfilepath as nvarchar = 'c:\somedir\somefile2.ext';
DECLARE @somepassword as nvarchar = 'password';
BACKUP CERTIFICATE MyCertificate TO FILE = @somefilepath
WITH PRIVATE KEY (FILE = @anotherfilepath,
ENCRYPTION BY PASSWORD = @somepassword);

'parse'を実行してステートメントをテストすると、次のようになります。'@somefilepath'の近くの構文が正しくありません。このタイプのステートメントでは変数を使用できないようです。これが本当かどうか誰かが私に理解するのを手伝ってもらえますか?

このバックアップを変数で機能させる方法はありますか?

より大きなスクリプトがあり、手動で変更する必要のある場所をファイルで検索するのではなく、ユーザーが1つの場所でパスとパスワードを簡単に変更できるようにしたいと考えています。

4

1 に答える 1

2

動的SQLを使用します。

DECLARE
   @somefilepath as nvarchar(255) = 'c:\somedir\somefile.ext',
   @anotherfilepath as nvarchar(255) = 'c:\somedir\somefile2.ext',
   @somepassword as nvarchar(100) = 'password',
   @SQL as nvarchar(max);

SET @SQL = 'BACKUP CERTIFICATE MyCertificate TO FILE = ' + QuoteName(@somefilepath, '''') + '
WITH PRIVATE KEY (FILE = ' + QuoteName(@anotherfilepath, '''') + ',
ENCRYPTION BY PASSWORD = ' + QuoteName(@somepassword, '''') + ');';
EXEC (@SQL);

また、常に、charデータ型の長さを常に指定してください。この習慣を身につけないと、いつかひどく噛み付くでしょう。理由は次のとおりです。

  • ストアドプロシージャではn/var/char、長さが定義されていないパラメータのデフォルトの長さは1文字です。
  • 他のコンテキストでは、n/var/charパラメーターのデフォルトの長さは30文字です。これは、バージョンでは問題ない場合varcharがありますが、。ではほぼ間違いなく間違っていcharます。SELECT INTOを使用してテーブルを作成するために値が使用される場合、明示的に選択されたものではなく、不思議な長さになります。
  • 長さを明示的に定義しないと、コードにアクセスする次の開発者はvarchar長さの正確なルールを知る必要があり、明示的ではなく暗黙的であるため、エラーに陥る可能性があります。列の長さを変更する必要があり、パラメーターの長さも強制的に変更するとしますが、パラメーターには長さがないため、スキップされます。
  • 本当に1文字または30文字が必要な場合は、コードにアクセスする次の開発者が長さの不足をエラーと見なさないように指定し、それが何であるか、またはそれは間違いでした。
  • それはあなたが専門家によって無知な初心者として密かに笑われることからあなたを救うことによってあなたの評判を助けるでしょう。
于 2012-07-20T17:55:37.027 に答える