2015-05-28 4 views
2

Я получаю следующую ошибку, когда пытаюсь использовать переменную в качестве имени столбца.Как использовать переменную как имя столбца

Ошибка

Msg 207, Level 16, State 1, Line 45
Invalid имя столбца '@WKNUM'.

Код

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 

Любая идея, почему он дает эту ошибку?

+2

Вы не можете использовать переменную для имени столбца, подобного этому. Вместо этого используйте динамический sql. –

+0

Опишите, что именно вы хотите сделать? Я смутил, что вы хотите изменить имя столбца, или хотите добавить новый столбец, или хотите обновить некоторые столбцы или, возможно, другое дело;). –

+0

Это выглядит как ужасно неэффективный способ попробовать «PIVOT». –

ответ

1

Обычно вы не можете использовать переменные как имена столбцов, как вы пытаетесь:

Лучше всего было бы построить строку обновления, включая все переменные, а затем выполняет его после завершения:

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) 
0
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) 

вас определите @WKNUM как INT, который даст вам значение 17,18,19 .. подтверждает, что у вас есть Имя столбца как это ... если это, то вы должны использовать динамический SQL, как это ..

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) 
0

Существует только одна проблема, которую я обнаружил, что вы использовали имя переменной вместо фактического имени столбца.

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 

У меня есть какое-то предложение для вас.

  1. Во время тестирования SET NOCOUNT опция всегда выключена.
  2. Alywas следует за стандартным правилом при создании таблицы, в вашем случае вы указываете пробел в имени столбца. Никогда не создавайте этот тип столбца.
Смежные вопросы