2010-05-24 2 views
0

У меня есть сайт, управляемый данными, с множеством хранимых процедур. То, что я хочу, чтобы в конечном счете быть в состоянии сделать это, чтобы сказать что-то вроде:SQL Server хранимые процедуры - обновить столбец на основе имени переменной ..?

For Each @variable in sproc inputs 
    UPDATE @TableName SET @variable.toString = @variable 
Next 

Я хотел бы, чтобы быть в состоянии принять любое количество аргументов.

Он будет в основном проходить через все входы и обновлять столбец с именем переменной со значением переменной - например, столбец «Имя» будет обновляться со значением @Name. Я хотел бы иметь в основном одну хранимую процедуру для обновления и одну для создания. Однако для этого мне нужно будет иметь возможность преобразовать фактическое имя переменной, а не значение, в строку.

Вопрос 1: Возможно ли это сделать в T-SQL, и если да, то как?

Вопрос 2: Есть ли какие-либо существенные недостатки в использовании чего-либо подобного (например, производительности или использования ЦП)?

Я знаю, что если значение недействительно, оно предотвратит обновление только этой переменной и любых последующих, но все данные будут проверены в коде vb.net в любом случае, поэтому всегда будет действовать при отправке в базу данных , и я гарантирую, что могут быть представлены только переменные, в которых находится столбец.

Большое спасибо заранее,

С уважением,

Ричард Кларк

Edit:

Я знаю об использовании строк SQL и риск атак SQL-инъекции - Я изучил это немного в моей диссертации несколько недель назад.

В основном сайт использует объектно-ориентированную архитектуру. Существует много классов - например, Product - которые имеют много атрибутов (я создал свой собственный класс под названием Attribute, который имеет такие свойства, как DataField, Name и Value, где DataField используется для получения или обновления данных, Name отображается в администрации frontend при создании или обновлении Продукта и значения, которое может отображаться на интерфейсе клиента, задается администратором. DataField - это поле, которое я буду использовать в «UPDATE Blah SET @Field = @Value».

Я знаю, что это, вероятно, запутывает, но его очень сложно объяснить - у меня действительно хорошее понимание всей системы в моей голове, но я не могу легко выразить это словами.

В основном структура настроена так, что никакой пользователь сможет изменить значение DataField o r Имя, но они могут изменить значение. Я думаю, что если бы я использовал динамические параметризованные строки SQL, то не было бы риска для SQL-инъекций.

Я имею в виду в основном цикл через все атрибуты, так что в конце концов, как:

UPDATE Products SET [Name] = '@Name', Description = '@Description', Display = @Display 

Затем цикл через все снова атрибуты и добавить значения параметров - это будет иметь тот же эффект, используя хранимые процедуры, правильно??

Я не возражаю, добавляя к времени загрузки страницы, так как это в основном повлияет на интерфейс администратора и окажет маргинальное влияние на внешний интерфейс клиента.

+1

Dare Я спрашиваю, почему вы хотите это сделать? –

+0

Я хочу сделать это, чтобы иметь возможность добавлять атрибуты, скажем, продукта из интерфейса администратора. У меня в основном есть массив, например Product, в классе «Менеджер», называемом ProductManager. ProductManager наследует от Менеджера, который перебирает все строки в таблице Products и создает экземпляр Product для каждого с правильными деталями при его создании. Я хотел бы расширить это, чтобы администратор мог добавлять атрибут, который затем может использовать на интерфейсе клиента. К сожалению, это в настоящее время означает изменение sprocs каждый раз. – ClarkeyBoy

ответ

2

Вопрос 1: вы должны использовать динамический SQL - построить инструкцию по обновлению в виде строки и запустить ее с помощью команды EXEC.

Вопрос 2: да, есть атаки SQL-инъекций, риск неправильных запросов, добавлены дополнительные затраты на сбор отдельного оператора SQL.

+0

Ive добавил более подробную информацию, принимая во внимание этот ответ. – ClarkeyBoy

+0

Нет, вы не можете параметризовать динамический SQL, который вы передаете в 'EXEC' –

2

Ваш пример очень неэффективен, поэтому, если я пройду через 10 столбцов, вы будете обновлять одну и ту же таблицу 10 раз?

Лучший способ это сделать одно обновление с помощью sp_executesql и построить это динамически, посмотрите на The Curse and Blessings of Dynamic SQL, чтобы посмотреть, как вы должны сделать это

0

Это новая система, в которой у вас есть свобода дизайн по мере необходимости, или вы застряли с существующим дизайном БД?

Вы можете рассматривать атрибуты не как столбцы, а как строки в дочерней таблице.

В родительском MyObject у вас есть только данные уровня заголовка, вещи, общие для всех объектов в системе (возможно, только идентификатор). В дочерней таблице MyObjectAttribute у вас будет первичный ключ с другим значением attrValue столбца. Таким образом вы можете сделать ОБНОВЛЕНИЕ, например:

UPDATE MyObjectAttribute 
    SET attrValue = @myValue 
    WHERE objectID = @myID 
    AND attrName = @myAttrName 
+0

Я уже рассматривал это, но текущая живая система нуждается в обновлении, и для этого потребуется слишком много изменений для реализации на данный момент, без большого риска возникновения ошибок. Я имею в виду, что в настоящее время все атрибуты хранятся в виде столбцов. На данный момент система немного медленная - на загрузку первой страницы (почти мгновенно после этого) занимает около 2 - 3 секунд. Я чувствую, что реализация вашего предложения может слишком замедлить его. Вы пробовали такой подход раньше? Это работает? Это эффективно? Спасибо. Richard – ClarkeyBoy

+0

Просто подумал о чем-то другом, ссылаясь на ваше первое предложение - в основном администратор сможет добавлять и удалять атрибуты по своему усмотрению. Существуют некоторые стандартные атрибуты, такие как «Созданный», «Модифицированный» и «Идентификатор». Существуют также некоторые из них, которые применимы только к некоторым типам предметов. Моя цель заключается в том, что администратор должен иметь возможность добавлять поля для определенных типов элементов. Я добавил дополнительную информацию о сайте в свой профиль (включая адрес сайта). – ClarkeyBoy

Смежные вопросы