C#MSSQL alter table然后修改值

时间:2010-11-16 12:22:11

标签: c# sql-server tsql ado.net

虽然以下在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#不能像管理工作室那样做?

有没有其他方法可以执行查询操作,在C#中有效?我需要在400个数据库上执行此操作,所以我真的很喜欢一个脚本来为我做这个。

提前致谢!

SQL Server版本是2008。 经理版本是2008(10.0.2531)。 .NET框架版本是2.0。

4 个答案:

答案 0 :(得分:3)

我猜您的c#代码中存在拼写错误。

错误是 PeriodeID ,而您的列名是 PeriodID

答案 1 :(得分:3)

如果表中还没有PeriodID列,我在Management Studio中运行“无效列名'PeriodID'”,

摄制:

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)

然后它将在列确实存在的位置进行编译。

答案 2 :(得分:2)

澄清:

1 - 您想将此脚本推送到许多数据库吗?

2 - 无效的列名'PeriodeID',我看不到名为“PeriodeId”的列,但是“PeriodId”,这是一个错字吗?

3 - 你可以在没有主BEGIN / END块的情况下尝试相同的块吗?

答案 3 :(得分:1)

服务器整理不区分大小写?因为您要添加Period Id ,然后更新Period ID