Please start any new threads on our new
site at https://forums.sqlteam.com. We've got lots of great SQL Server
experts to answer whatever question you can come up with.
| Author |
Topic |
|
merlintintin
Starting Member
5 Posts |
Posted - 2008-05-14 : 07:52:53
|
hello, I have a big problem with a script.. some instructions seems to be not executed. I don't understand. If I execute line perline it's ok - but the entire block no.Explain me and find the solution:IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ACS_ACL' AND COLUMN_NAME = 'ZoneUId' )BEGIN ALTER TABLE dbo.ACS_ACL ADD ZoneUId T_UID; UPDATE dbo.ACS_ACL SET ZoneUId = '1' WHERE ZoneUId IS NULL; print 'end of script'END result:Msg 207, Level 16, State 1, Line 9Invalid column name 'ZoneUId'.the error is on line: UPDATE dbo.ACS_ACL SET ZoneUId = '000000001' WHERE ZoneUId IS NULL;how is is possible because the preceding line is ALTER TABLE dbo.ACS_ACL ADD ZoneUId T_UID; |
|
|
harsh_athalye
Master Smack Fu Yak Hacker
5581 Posts |
Posted - 2008-05-14 : 08:02:30
|
| [code]IF NOT EXISTS ( SELECT *FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ACS_ACL'AND COLUMN_NAME = 'ZoneUId' )ALTER TABLE dbo.ACS_ACL ADD ZoneUId T_UIDGOUPDATE dbo.ACS_ACL SET ZoneUId = '1' WHERE ZoneUId IS NULLprint 'end of script'GO[/code]Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED" |
 |
|
|
merlintintin
Starting Member
5 Posts |
Posted - 2008-05-14 : 08:45:21
|
| I'm not very satisfied by this solution.. I have simplified my script for you but it was more complicated... The script could/must be executed 2 times without error..DECLARE @zoneUId CHAR(9)IF NOT EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].ACS_ZONE') )BEGIN CREATE TABLE dbo.ACS_ZONE ( UId T_UID NOT NULL, Version T_VERSION NOT NULL, Name T_NAME NOT NULL, BuiltIn T_BOOL NOT NULL, Comment T_COMMENT NULL, ) ALTER TABLE dbo.ACS_ZONE ADD CONSTRAINT PK_ACS_ZONE PRIMARY KEY (UId) -- INSERT UID INTO SYS_UID INSERT INTO SYS_UID (Name,KeyCurrentValue,HighValueSize,LowValueSize,SysType) VALUES ('ACS_ZONE','00000',5,4,'E') -- INSERT INTO ACS_ZONE INSERT INTO ACS_ZONE ([UId],[Version],[Name],[BuiltIn],[Comment]) VALUES (dbo.GetNextUId('ACS_ZONE','1'), '000000000','System',1,'Default zone'); SET @zoneUId = ( SELECT UId FROM ACS_ZONE WHERE Name = 'System' )END-- ADD COLUMN: ACS_ACL.ZoneUIdIF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ACS_ACL' AND COLUMN_NAME = 'ZoneUId' )ALTER TABLE dbo.ACS_ACL ADD ZoneUId T_UID GOUPDATE dbo.ACS_ACL SET ZoneUId = @zoneUId WHERE ZoneUId IS NULLGOALTER TABLE dbo.ACS_ACL ALTER COLUMN ZoneUId T_UID NOT NULLALTER TABLE dbo.ACS_ACL ADD CONSTRAINT FK_ACS_ACL_ACS_ZONE FOREIGN KEY (ZoneUId) REFERENCES ACS_ZONE (UId)ALTER TABLE dbo.ACS_ACL DROP CONSTRAINT PK_ACS_ACL ALTER TABLE dbo.ACS_ACL ADD CONSTRAINT PK_ACS_ACL PRIMARY KEY (GroupUId,ResourceUId,PermissionUId, ZoneUId)MESSAGE:Msg 137, Level 15, State 2, Line 3Must declare the scalar variable "@zoneUId".If I place a GO, the scalar variable is not defined anymore... How to proceed by writing all statement in BEGIN AND clause ? |
 |
|
|
harsh_athalye
Master Smack Fu Yak Hacker
5581 Posts |
Posted - 2008-05-14 : 08:53:07
|
quote: Originally posted by merlintintin I'm not very satisfied by this solution.. I have simplified my script for you but it was more complicated... The script could/must be executed 2 times without error..DECLARE @zoneUId CHAR(9)IF NOT EXISTS ( SELECT * FROM dbo.sysobjects WHERE id = object_id(N'[dbo].ACS_ZONE') )BEGIN CREATE TABLE dbo.ACS_ZONE ( UId T_UID NOT NULL, Version T_VERSION NOT NULL, Name T_NAME NOT NULL, BuiltIn T_BOOL NOT NULL, Comment T_COMMENT NULL, ) ALTER TABLE dbo.ACS_ZONE ADD CONSTRAINT PK_ACS_ZONE PRIMARY KEY (UId) -- INSERT UID INTO SYS_UID INSERT INTO SYS_UID (Name,KeyCurrentValue,HighValueSize,LowValueSize,SysType) VALUES ('ACS_ZONE','00000',5,4,'E') -- INSERT INTO ACS_ZONE INSERT INTO ACS_ZONE ([UId],[Version],[Name],[BuiltIn],[Comment]) VALUES (dbo.GetNextUId('ACS_ZONE','1'), '000000000','System',1,'Default zone'); SET @zoneUId = ( SELECT UId FROM ACS_ZONE WHERE Name = 'System' )END-- ADD COLUMN: ACS_ACL.ZoneUIdIF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'ACS_ACL' AND COLUMN_NAME = 'ZoneUId' )ALTER TABLE dbo.ACS_ACL ADD ZoneUId T_UID GOSET @zoneUId = ( SELECT UId FROM ACS_ZONE WHERE Name = 'System' )UPDATE dbo.ACS_ACL SET ZoneUId = @zoneUId WHERE ZoneUId IS NULLGOALTER TABLE dbo.ACS_ACL ALTER COLUMN ZoneUId T_UID NOT NULLALTER TABLE dbo.ACS_ACL ADD CONSTRAINT FK_ACS_ACL_ACS_ZONE FOREIGN KEY (ZoneUId) REFERENCES ACS_ZONE (UId)ALTER TABLE dbo.ACS_ACL DROP CONSTRAINT PK_ACS_ACL ALTER TABLE dbo.ACS_ACL ADD CONSTRAINT PK_ACS_ACL PRIMARY KEY (GroupUId,ResourceUId,PermissionUId, ZoneUId)MESSAGE:Msg 137, Level 15, State 2, Line 3Must declare the scalar variable "@zoneUId".If I place a GO, the scalar variable is not defined anymore... How to proceed by writing all statement in BEGIN AND clause ?
Harsh AthalyeIndia."The IMPOSSIBLE is often UNTRIED" |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2008-05-14 : 08:53:09
|
Well, some DML statements cannot be run in batches.CREATE PROCEDURE is on of them.ALTER TABLE is another.Perhaps you could turn to DYNAMIC SQL? E 12°55'05.25"N 56°04'39.16" |
 |
|
|
SwePeso
Patron Saint of Lost Yaks
30421 Posts |
Posted - 2008-05-14 : 08:54:41
|
Harsh, I think the code above is part of an SPROC, and as such you can't have GO within. E 12°55'05.25"N 56°04'39.16" |
 |
|
|
merlintintin
Starting Member
5 Posts |
Posted - 2008-05-14 : 09:55:03
|
| The script is a part of a longer script that is used to update a version of an application to the next. The script is executed manually by a person. |
 |
|
|
merlintintin
Starting Member
5 Posts |
Posted - 2008-05-14 : 10:06:57
|
| But.. I dont understand...in this case:IF (condition = TRUE)BEGIN SQL_STATEMENT 1 GO SQL_STATEMENT 2 GO SQL_STATEMENT 3 GOEND=>SQL_STATEMENT 2 and SQL_STATEMENT 3 are not executed... so, what is the role of begin end if only 1st statement is executed ? |
 |
|
|
eralper
Yak Posting Veteran
66 Posts |
Posted - 2008-05-14 : 10:07:00
|
| Hello,You can force the population of new column for existing rows with NOT NULL constraint and with a DEFAULT valueCan you try the following scriptIF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'EY_X' AND COLUMN_NAME = 'ZoneUId2') ALTER TABLE dbo.EY_X ADD ZoneUId2 int NOT NULL DEFAULT 1Eralperhttp://www.kodyaz.com/content/SQLServerArticles.aspx-------------Eralperhttp://www.kodyaz.com |
 |
|
|
merlintintin
Starting Member
5 Posts |
Posted - 2008-05-14 : 11:01:08
|
| yes your are right. 3 statement in 1 ! Nice optimisation...Thanks.What about IF () BEGIN.. END ? |
 |
|
|
|
|
|
|
|