2010-10-21 2 views
2

У меня есть простой запрос, который обновляет столбец переменной. Этот запрос позже string.Formatted и передается SqlCommand (C#) (TABLEID столбец в SomeTable):Возможно ли обновить переменное поле в хранимой процедуре?

"UPDATE SomeTable set {0}[email protected] where [email protected]" 

Мне нужно преобразовать этот запрос в хранимой процедуре. Это вообще возможно?

+1

Использование «SqlCommand» подразумевает SQL Server –

+0

ли 'TableId' столбец в таблице или SYS ссылка на объект? – Brad

+0

это SQL и TableId - это столбец в SomeTable (только что отредактированный вопрос) – kateroh

ответ

6

Это может быть сделано только с помощью динамического SQL в хранимой процедуре (как Брэд alreayd ответил, но, конечно, вы будете использовать QUOTENAME(@columnName) правильно защитить от инъекции SQL, а также использовать тип sysname параметра). Если вы идете по этому пути, я рекомендую вам сначала прочитать The Curse and Blessings of Dynamic SQL.

Обновлено:

Я должен был отправить код, так как код Брэда имеет слишком много ошибок.

create procedure myCustomUpdate 
    @columnName sysname, 
    @value sql_variant, 
    @id int 
AS 
declare @sql NVARCHAR(max); 
set @sql = N'UPDATE SomeTable SET ' + QUOTENAME(@columnName) 
    + N' = @value WHERE TableId = @id'; 
exec sp_executesql @sql, N'@value sql_variant, @id int', @value, @id; 
+2

+1 - им действительно нужно просто закодировать в StackOverflow, что всякий раз, когда «динамический SQL» вводится автоматически, гиперссылки на эту статью ... – JNK

+0

Спасибо за улучшения Remuss. Я думаю, это неудивительно, что у вас есть репутация 56 тыс., И мне еще предстоит достичь 2 тыс. :) Я согласен с тем, что вы должны защищать от инъекций, но могли бы вы действительно использовать кавычки вокруг имени столбца? – Brad

+0

Если какой-либо из этих данных на самом деле не закодирован, тогда вы должны ... Я должен сказать, мне любопытно, насколько это важно. Какая цель заключается в использовании хранимой процедуры, которая в основном выполняет запрос, который полностью определяется его параметрами? Почему бы просто не пропустить SP полностью и написать весь запрос в коде? –

4

Я делаю несколько предположений о том, что вы делаете, но оцените этот код.

CREATE PROCEDURE UpdateTableValue 
    (
    @tableId INT 
    ,@columnName sql_variant 
    ,@value VARCHAR(10) 
    ) 
AS 
    BEGIN 

     DECLARE @sql NVARCHAR(MAX) 
     SET @sql = N'UPDATE SomeTable ' 
        + N'SET ' + QUOTENAME(@columnName) + N' = = @value ' 
        + N'WHERE TableId = @tableId' 

    EXEC sp_executesql @sql 
      , N'@value sql_variant, @tableId int' 
      , @value, @tableId; 

    END 
1

Я думаю, что есть лучшее решение, в статье, упомянутой Рем: The Curse and Blessings of Dynamic SQL . Я закончил с использованием СЛУЧАЙ переключателей для оптимизации производительности (динамический SQL не кэшируются), как в статье:

UPDATE tbl 
SET col1 = CASE @colname WHEN 'col1' THEN @value ELSE col1 END, 
     col2 = CASE @colname WHEN 'col2' THEN @value ELSE col2 END, 
Смежные вопросы