Ogoun
@Ogoun
Programmer

Как использовать переменные (SqlParameter) в запросе c ALTER TABLE из .NET приложения?

Пишу утилиту на C#, утилита должна уметь автоматически создавать новые поля в таблицах SQL Server'а.
При этом поля NOT NULL должны заполняться значениями по умолчанию (или заданными значениями).

Т.е. делаю что-то вроде такого:
// формирую команду
//..........................
StringBuilder alter = new StringBuilder("ALTER TABLE [" + _tableName + "] ADD ");
foreach (var c in _createColumns)
    {
        alter.Append("[" + c.Name + "] " + c.DbType);
//.........................
// если встречаю not null поле
if (c.AllowNull==false)
    alter.Append(" NOT NULL DEFAULT(@" + c.Name + ")");
//.........................

// И при выполнении запроса формирую параметры по умолчанию
public SqlParameter[] GetDefaultAlterParameters()
{
        return _createColumns.Select(c => new SqlParameter(c.Name, GetDefaultValue(c.DotNetType))).ToArray();
}


Но, проблема в том, что нельзя использовать переменные в таких командах, получаю исключение вида:
Variables are not allowed in the ALTER TABLE statement.

Есть ли способ отключить или обойти этот запрет? Нашел вариант через создание временных функций, но некрасиво получается.
Или лучший путь формировать сплошную строку команды, экранируя при необходимости значения?
  • Вопрос задан
  • 2503 просмотра
Пригласить эксперта
Ответы на вопрос 1
Ogoun
@Ogoun Автор вопроса
Programmer
Красивого варианта не нашел, сделал следующим образом:
1. Создаются новые поля, всем разрешается иметь значения NULL (1 запрос)
2. Таблица обновляется, полям которые должны быть NOT NULL проставляются значения по умолчанию (1 запрос)
Можно полноценно использовать переменные
UPDATE [TABLE_NAME] SET [COLUMN_NAME]=@COLUMN_DEFAULT_VALUE

3. Обновляются поля которые должны быть NUTT NULL (1 запрос на каждое поле)
ALTER TABLE [TABLE_NAME] ALTER COLUMN [COLUMN_NAME] COLUMN_TYPE NOT NULL
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы