虽然以下在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。
答案 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