I've a task:
Create SQL script to add the column to the database and update it immediately. But this script could be started more then one time - so it is required to this (add and update) only first time.
Here is my solution:
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'PlateDistance')
BEGIN
ALTER TABLE [OmniCalc].[dbo].[Table1]
ADD [PlateDistance] decimal(18,0) default 0 NOT NULL;
UPDATE [OmniCalc].[dbo].[Table1]
SET [PlateDistance] = [bauteilAbstand] / 2
END
GO
But in result i get:
Msg 207, Level 16, State 1, Line 13
Invalid column name 'PlateDistance'.
I've tried to do some changes to allow GO batch processing, but in this case it is impossible to avoid situation when scripts overwrite user data by scenario:
1. Start script
2. User changes some data
3. Start script again
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'PlateDistance')
BEGIN
ALTER TABLE [dbo].Table1
ADD [PlateDistance] decimal(18,0) default 0 NOT NULL;
Select [PlateDistance] from [dbo].Table1
END
GO
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'PlateDistance')
BEGIN
UPDATE [dbo].Table1
SET [PlateDistance] = [bauteilAbstand] / 2
END
GO
And even if I add variable to the construction - It does not help because variable is loss after GO operator.
DECLARE @created BIT;
SET @created = 0;
IF NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'PlateDistance')
BEGIN
ALTER TABLE [dbo].Table1
ADD [PlateDistance] decimal(18,0) default 0 NOT NULL;
Select [PlateDistance] from [dbo].Table1
SET @created = 1;
END
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Table1' AND COLUMN_NAME = 'PlateDistance') AND @created = 1
BEGIN
UPDATE [dbo].Table1
SET [PlateDistance] = [bauteilAbstand] / 2
END
GO
So. Question - how to ADD column and UPDATE its data immediately only on the first script run?