Reputation: 21
I am getting the following error when I try to use a variable as a column name.
Error
Msg 207, Level 16, State 1, Line 45
Invalid column name '@WKNUM'.
Code
SET NOCOUNT ON
GO
DECLARE @WKNUM int
SET @WKNUM = 17
WHILE (@WKNUM < 20)
BEGIN;
UPDATE dbo.DataModel_TEST_NUM
SET dbo.DataModel_TEST_NUM.[@WKNUM] = dbo.TEST2.[New Value]
FROM dbo.TEST2
INNER JOIN dbo.DataModel_TEST_NUM
ON dbo.TEST2.[Opportunity ID] = dbo.DataModel_TEST_NUM.opportunityID
WHERE (dbo.TEST2.WKNUM = @WKNUM)
SET @WKNUM = @WKNUM + 1
END;
GO
SET NOCOUNT OFF
GO
Any idea why it is giving this error?
Upvotes: 2
Views: 67
Reputation: 5808
There is only one issue I found that you used variable name instead of actual column name.
begin tran
create table DataModel_TEST_NUM (opportunityID int, WKNUM int )
create table TEST2 (opportunityID int, WKNUM int, new_value int )
insert into DataModel_TEST_NUM values (1, 18) , (2,25 ),(3,19 ), (4,30)
insert into TEST2 values (1, 18, 19) , (2 ,25 ,26 ),(3,19, 20 ), (4,30,31)
--SET NOCOUNT ON
--GO
select * from DataModel_TEST_NUM
DECLARE @WKNUM int
SET @WKNUM = 17
WHILE (@WKNUM < 20)
BEGIN;
UPDATE dbo.DataModel_TEST_NUM
SET [WKNUM] = dbo.TEST2.[new_value]
--select *
FROM dbo.TEST2
INNER JOIN dbo.DataModel_TEST_NUM
ON dbo.TEST2.[opportunityID] = dbo.DataModel_TEST_NUM.opportunityID
WHERE (dbo.TEST2.WKNUM = @WKNUM)
SET @WKNUM = @WKNUM + 1
END;
--GO
--SET NOCOUNT OFF
--GO
select * from DataModel_TEST_NUM
select * from test2
rollback
--actual data
opportunityID WKNUM
1 18
2 25
3 19
4 30
--after while loop and update query
opportunityID WKNUM
1 19
2 25
3 20
4 30
I have some suggestion for you.
SET NOCOUNT
option is always off.Upvotes: 0
Reputation: 2379
UPDATE dbo.DataModel_TEST_NUM
SET dbo.DataModel_TEST_NUM.[@WKNUM] = dbo.TEST2.[New Value]------What you are try to do here ...!!!
---you can not define column name like this..
FROM dbo.TEST2
INNER JOIN
dbo.DataModel_TEST_NUM ON dbo.TEST2.[Opportunity ID] = dbo.DataModel_TEST_NUM.opportunityID
WHERE (dbo.TEST2.WKNUM = @WKNUM )
you define @WKNUM as INT that will give you value 17,18,19.. is it confirm that you have column name like this...if it is then you have to use dynamic sql like this..
DECLARE @update VARCHAR(1000)
SET @update = 'UPDATE dbo.DataModel_TEST_NUM SET dbo.DataModel_TEST_NUM.[' + @WKNUM + '] = dbo.TEST2.[New Value]
FROM dbo.TEST2 INNER JOIN dbo.DataModel_TEST_NUM ON dbo.TEST2.[Opportunity ID] = dbo.DataModel_TEST_NUM.opportunityID
WHERE (dbo.TEST2.WKNUM = ' + @WKNUM + ' ) '
EXEC(@update )
Upvotes: 0
Reputation: 8838
Typically you cannot use variables as column names as you are attempting:
Best would be to build the update string including all variables and then executing it once completed:
DECLARE @SqlString VARCHAR(1000)
SET @SqlString = 'UPDATE dbo.DataModel_TEST_NUM SET dbo.DataModel_TEST_NUM.[' + @WKNUM + '] = dbo.TEST2.[New Value]
FROM dbo.TEST2 INNER JOIN dbo.DataModel_TEST_NUM ON dbo.TEST2.[Opportunity ID] = dbo.DataModel_TEST_NUM.opportunityID
WHERE (dbo.TEST2.WKNUM = ' + @WKNUM + ' ) '
EXEC(@SqlString)
Upvotes: 1