4

開発者がデータベースを簡単に更新できるようにしています。これを行う方法は、動的クエリを作成することです。動的クエリでは、最初に変数を定義し、クエリはその変数を他のすべてに使用します。Stackoverflow から多くの推奨事項を使用しましたが、これを機能させることはできません。

USE MyDatabase
DECLARE @TABLE VARCHAR(200) = 'MyTable'
DECLARE @COLUMN VARCHAR(200) = 'MyColumn'
DECLARE @DATATYPE VARCHAR(200) = 'VARCHAR(200)'

IF COL_LENGTH(@TABLE, @COLUMN) IS NULL
BEGIN
    DECLARE @SQL as NVARCHAR(MAX) = 'ALTER TABLE ' + @TABLE + ' ADD COLUMN ' 
      + @COLUMN +' '+ @DATATYPE
    EXEC SP_EXECUTESQL @SQL
END

エラーが発生します:

キーワード「COLUMN」付近の構文が正しくありません。

4

2 に答える 2

7

エラーメッセージが示すように、それは間違った構文です。やや紛らわしいことに、列を追加するときにCOLUMNキーワードは許可されていません。

また、可能なすべての有効な名前 (現在は と同等) に対処し、を含むオブジェクト名を正しくエスケープするために使用するVARCHAR(200)必要があります。SYSNAMEnvarchar(128)QUOTENAME]

これについての詳細は、The Curse and Blessings of Dynamic SQL: Dealing with Dynamic Table and Column Names にあります。

于 2013-06-19T21:03:36.410 に答える
3

SQL インジェクションにさらされるため、これを行うことは強くお勧めしません。ただし、必要に応じて、スクリプトから COLUMN という単語を削除すると、機能するはずです。

USE MyDatabase
DECLARE @TABLE VARCHAR(200) = 'MyTable'
DECLARE @COLUMN VARCHAR(200) = 'MyColumn'
DECLARE @DATATYPE VARCHAR(200) = 'VARCHAR(200)'

IF COL_LENGTH(@TABLE, @COLUMN) IS NULL
BEGIN
    DECLARE @SQL as NVARCHAR(MAX) = 'ALTER TABLE ' + @TABLE + ' ADD ' + @COLUMN     +' '+ @DATATYPE
    EXEC SP_EXECUTESQL @SQL
END
于 2013-06-19T21:08:47.370 に答える