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.

 All Forums
 SQL Server 2005 Forums
 Transact-SQL (2005)
 begin end - not executed

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 9
Invalid 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_UID
GO

UPDATE dbo.ACS_ACL SET ZoneUId = '1' WHERE ZoneUId IS NULL
print 'end of script'
GO[/code]

Harsh Athalye
India.
"The IMPOSSIBLE is often UNTRIED"
Go to Top of Page

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.ZoneUId
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_UID
GO


UPDATE dbo.ACS_ACL SET ZoneUId = @zoneUId WHERE ZoneUId IS NULL
GO

ALTER TABLE dbo.ACS_ACL ALTER COLUMN ZoneUId T_UID NOT NULL
ALTER 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 3
Must 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 ?








Go to Top of Page

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.ZoneUId
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_UID
GO

SET @zoneUId = ( SELECT UId FROM ACS_ZONE WHERE Name = 'System' )
UPDATE dbo.ACS_ACL SET ZoneUId = @zoneUId WHERE ZoneUId IS NULL
GO

ALTER TABLE dbo.ACS_ACL ALTER COLUMN ZoneUId T_UID NOT NULL
ALTER 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 3
Must 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
India.
"The IMPOSSIBLE is often UNTRIED"
Go to Top of Page

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"
Go to Top of Page

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"
Go to Top of Page

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.
Go to Top of Page

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
GO
END



=>


SQL_STATEMENT 2 and SQL_STATEMENT 3 are not executed... so, what is the role of begin end if only 1st statement is executed ?




Go to Top of Page

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 value

Can you try the following script


IF 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 1


Eralper
http://www.kodyaz.com/content/SQLServerArticles.aspx



-------------
Eralper
http://www.kodyaz.com
Go to Top of Page

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 ?
Go to Top of Page
   

- Advertisement -