I need to add a new column to the table with not null and default date time. But I get the error as below. I have checked multiple instances but the error occurs.
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT @date';
EXEC sp_executesql @SQL;
This is the error I get.
Must declare the scalar variable "@date".
Any solution?
CodePudding user response:
If you replace @date with the value, it'll work.
But let's look at why it isn't working. Your SQL:
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT @date';
EXEC sp_executesql @SQL;
Declares a couple of variables and executes a block of SQL that one of the variables represents. Your issue is that sp_executesql reads some text as SQL and tries to run it - if you can't run what you tell it to run, then it can't.
So if you were to crack open a new query window and attempt to run:
ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT @date
It'd have a meltdown trying to figure out what @date is supposed to be.
DECLARE @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000';
ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT @date;
Would work, or simply:
ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT '9999-12-31 00:00:00.000';
So, using concatenation you can do:
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT ' @date;
EXEC sp_executesql @SQL;
Which will get you a different error, so try including a pair of quotes in the date variable:
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '''9999-12-31 00:00:00.000'''
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT ' @date;
EXEC sp_executesql @SQL;
CodePudding user response:
What you are looking for is like below where you create a dynamic SQL via concatenation
DECLARE @SQL NVARCHAR(1000), @date NVARCHAR(1000);
SET @date = '9999-12-31 00:00:00.000'
SET @SQL = 'ALTER TABLE [spi].[ProductClass]
ADD lastUpdatedTime datetime NOT NULL
CONSTRAINT default_updateTime DEFAULT ''' @date '''';
EXEC sp_executesql @SQL;
