1

パラメータを使用してINSERTステートメントを作成する必要があります。2つの変数名@DestinationFieldsがあるとし@InsertValuesます。

ここ@DestinationFieldsには、次のような列名が含まれ、次のような2つproduct,price@InsertValues列の値が含まれますBook,100

ここで、挿入コマンドを作成して、各値に引用符を追加する必要がある場所に値を挿入する方法を説明します。

私はすでに

EXEC('INSERT into tbl_test('+@DestinationFields+')values('+@InsertValues+')')

しかし、それはエラーを返しています。

この文脈では、「本」という名前は許可されていません。有効な式は、定数、定数式、および(一部のコンテキストでは)変数です。列名は許可されていません。

どうすればいいのですか?前もって感謝します。

4

2 に答える 2

4

ここではSQLインジェクションの問題がないふりをして*、の周りに引用符を追加することでコードをすばやく修正できますBook。の値@ InsertValues

'Book', 100

単にではなく

Book, 100

各文字列値を引用符で囲む必要があります。それ以外の場合、文字列は名前として解釈され、無効になります。

編集:(コメントへの応答)すべての列がvarcharタイプの場合、次のように、文字列全体を引用符で囲み、すべてのコンマをquote-comma-quoteパターンに置き換えることができます。

values('''+REPLACE(@InsertValues,',',''',''')+''')'


*このようなコードは、システムに深刻な害を及ぼすように操作される可能性があるため、本番環境に導入しないでください。これが問題の良い例です(リンク)。

于 2012-10-18T09:47:00.070 に答える
0

試す:

DECLARE @DestinationFields VARCHAR(200);
SET @DestinationFields = 'Col1, Col2, Col3'

DECLARE @InsertValues VARCHAR(200);
SET @InsertValues = '1, 2, 3'

DECLARE @SQLString VARCHAR(1000);

SET @SQLString = 'INSERT INTO tbl_test (' + @DestinationFields + ') VALUES (' + @InsertValues + ')';

EXEC (@SQLString)

ただし、これはSQLインジェクション攻撃に対して非常にオープンです。しかし、それはあなたが必要とすることをします。

動的SQLの呪いと祝福

于 2012-10-18T09:46:14.007 に答える