C # MSSQL изменить таблицу, а затем изменить значения - PullRequest
3 голосов
/ 16 ноября 2010

Хотя в SQL Server Management Studio отлично работает следующее, в C # оно не работает:

DECLARE @PeriodID AS bigint;
SELECT TOP 1 @PeriodID = PeriodID FROM Periods ORDER BY PeriodID DESC;
IF NOT EXISTS(SELECT * FROM information_schema.columns WHERE COLUMN_NAME = N'PeriodID' AND TABLE_NAME = N'MobilePlans')
BEGIN
    BEGIN
    ALTER TABLE MobilePlans ADD PeriodId bigint NULL
    END
    BEGIN
    UPDATE MobilePlans SET PeriodID = @PeriodID
    END
    BEGIN
    ALTER TABLE MobilePlans ALTER COLUMN PeriodID bigint NOT NULL
    END
END

В C # он продолжает говорить мне Invalid column name 'PeriodID'. и, проведя пару часов в поисках, я подумал, что я спрошу здесь.

Во время поиска я наткнулся на http://bytes.com/topic/c-sharp/answers/258520-problem-sqlcommand-t-sql-transaction,, но я не смог перевести мой условный запрос на него.

Почему C # не может сделать то же самое, что Management Studio?

Есть ли другой способ сделать то, что делает запрос, который работает в C #? Мне нужно выполнить это на 400 базах данных, поэтому мне бы очень хотелось, чтобы скрипт сделал это для меня.

Заранее спасибо!

Версия сервера SQL 2008. Версия менеджера 2008 (10.0.2531). .NET Framework версия 2.0.

Ответы [ 4 ]

3 голосов
/ 16 ноября 2010

Я получаю "недопустимое имя столбца 'PeriodID'", запустив его в Management Studio, , если в таблице еще нет столбца PeriodID .

Repro:

create table Periods (
    PeriodID bigint not null
)
go
insert into Periods(PeriodID) select 1
go
create table MobilePLans (
    BLah int not null
)
go
insert into MobilePLans(BLah) select 2
go
DECLARE @PeriodID AS bigint;
SELECT TOP 1 @PeriodID = PeriodID FROM Periods ORDER BY PeriodID DESC;
IF NOT EXISTS(SELECT * FROM information_schema.columns WHERE COLUMN_NAME = N'PeriodID' AND TABLE_NAME = N'MobilePlans')
BEGIN
    BEGIN
    ALTER TABLE MobilePlans ADD PeriodId bigint NULL
    END
    BEGIN
    UPDATE MobilePlans SET PeriodID = @PeriodID
    END
    BEGIN
    ALTER TABLE MobilePlans ALTER COLUMN PeriodID bigint NOT NULL
    END
END

Причина проста - SQL Server пытается полностью скомпилировать каждый пакет. Если столбец уже существует, оператор UPDATE может быть скомпилирован.Если нет, вы получите ошибку.

Если вы поместите обновление в Exec:

EXEC('UPDATE MobilePlans SET PeriodID = ' + @PeriodID)

Затем оно будет скомпилировано в тот момент, когда столбец существует.

3 голосов
/ 16 ноября 2010

Полагаю, в вашем коде c # есть орфографическая ошибка.

Ошибка говорит: PeriodeID , тогда как имя вашего столбца PeriodID .

2 голосов
/ 16 ноября 2010

Пояснение:

1 - Вы хотите использовать этот скрипт для многих баз данных?

2 - Неверное имя столбца «PeriodeID», я не вижу столбец с именем «PeriodeId», но «PeriodId», это опечатка?

3 - Можете ли вы попробовать один и тот же блок без основного блока BEGIN / END?

1 голос
/ 16 ноября 2010

Является ли сортировка сервера без учета регистра ?Потому что вы добавляете Period Id , а затем обновляете Period ID

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...