2016-05-09 12 views
-1

パラメータを使用して特定の列を更新するストアドプロシージャを開発しています。例えばストアドプロシージャをパラメータごとに更新する

CREATE PROCEDURE save_proc 
(
    @userid varchar(5), 
    @column varchar(10), 
    @data varchar(50) 
) 
AS 
BEGIN 
    UPDATE MyProfile 
    SET @column = @data 
    WHERE userid = @userid 

次は私が試したが、うまくいきませんでした私のコードです。パラメータを使用して特定の列を更新することによって、このような更新を行うことは可能ですか?ありがとう

+0

探しているものであることは思えます? – ydoow

+2

いいえ、その構文(列名ではなく変数)は無効です。代わりに、動的SQLを使用することができます(更新ステートメントを文字列として作成して実行する)。このSQL Serverやその他の製品ですか? – Blorgbeard

+0

Blorgbeard氏によると、動的SQL(重大な欠点、特にハッキングされる脆弱性があるかもしれない)を使用する必要があります。 http://stackoverflow.com/questions/12846743/dynamic-update-statement-with-variable-column-names?answertab=active#tab-top –

答えて

1

ストアドプロシージャでクエリを構築して実行することができます。

CREATE PROCEDURE save_proc 
(
    @userid varchar(5), 
    @column varchar(10), 
    @data varchar(50) 
) 
AS 
BEGIN 
    exec sp_executesql N'UPDATE MyProfile SET ' + @column + '=''' + @data + ''' WHERE userid = ''' + @userid + '''' 
END 

ただし、この方法ではセキュリティ上の問題が発生する可能性があります。

+0

ユーザーが' NULL'値を挿入したい場合? EXEC save_proc '5'、 'col'、NULL' – lad2025

+0

これは動作しません。あなたは引数として 'value/variable/DEFAULT'を' EXEC'に渡すことができ、連結は式です。 – lad2025

+0

[SQLインジェクション](http://bobby-tables.com/)を参照してください。 – HABO

1

そのなんとかが、私はそれをやって避けるだろう....あなたはコードは以下のようにする必要があります:行方不明のENDの後BEGINありますよう

DECLARE @column varchar(10) 
DECLARE @data varchar(50) 
UPDATE DummyTable 
SET 
col1 = CASE WHEN @column = 'Col1' THEN @data ELSE col1 END , 
col2 = CASE WHEN @column = 'Col2' THEN @data ELSE col2 END 
where userid = @userid 
. 
. 
. 

希望、これはあなたが

関連する問題