Проблема SQL Server с обновлением при использовании TVP - PullRequest
0 голосов
/ 02 марта 2012

У меня есть следующий sql

DECLARE @tmpSelectedData   TABLE  -- table variable
        (SlNo  INT IDENTITY(1,1) PRIMARY KEY
         ,dataID INT NULL
         ,ValID INT NULL
         ,DdrID INT NULL
         ,InrID INT NULL
         ,IprID INT NULL)

-- inserting into table variable
INSERT INTO @tmpSelectedData(dataID)  
    SELECT 
        SQ.dataID    
    FROM 
        @SelectedQuestions SQ 

    -- Update the table variable with some values

    tblData
       dataID,ValID,DdrID,InrID,IprID 
        1-    2-  3  - 4-   5
        2-    7-  4  - 5-       8
        3-    8-  2  - 4-       3
        4-    0-  1  - 2-       5

    @SelectedData  
        dataID
         2
         3
         4

    @tmpSelectedData    
        dataID,ValID,DdrID,InrID,IprID 
            2-    
            3-    
        4-    

UPDATE @tmpSelectedData   
SET IprID = D.dataID,
    DdrID = D.DdrID,
    InrID = D.InrID 
FROM tblData D 
INNER JOIN @SelectedData SD ON SD.dataID = D.dataID  

При использовании этого запроса все строки @tmpSelectedData будут обновлены на значение, соответствующее первой строке tblData

Ожидаемый результат в @tmpSelectedData:

   dataID,ValID,DdrID,InrID,IprID 
        2-    7-  4  - 5-       8
        3-    8-  2  - 4-       3
        4-    0-  1  - 2-       5

Фактический результат в @tmpSelectedData:

   dataID,ValID,DdrID,InrID,IprID 
        2-    7-  4  - 5-       8
        3-    7-  4  - 5-       8
        4-    7-  4  - 5-       8

будет обновляться только с первым значением

UPDATE @tmpSelectedData   
SET dataID = D.dataID,
    DdrID = D.DdrID,
    InrID = D.InrID 
FROM tblData D 
INNER JOIN @tmpSelectedData SD ON SD.IprID = D.IprID  

Когда я изменил его на @tmpSelectedData с @SelectedData (второй запрос), он будет работать и обновляться как ожидаемый результат.

В чем разница между двумя запросами?

Ответы [ 2 ]

3 голосов
/ 02 марта 2012

Это одна из проблем с синтаксисом UPDATE ... FROM - если он, по сути, пытается обновить одну и ту же строку несколько раз, конечный результат будет один изэти обновления, но какое не определено - , и оно не выдает сообщение об ошибке или предупреждение, когда это происходит .

То, что вы имеете в своем первом запросе UPDATE, это * 1011Предложение *, которое вообще не ссылается на таблицу, подлежащую обновлению, - это фактически некоррелированный запрос, так что весь набор результатов, созданный предложением FROM, применяется ко всем строкам в целевой таблице.Одна строка (в данном случае «первая», хотя она и не определена) - это строка, в которой «выигрывается» обновление (следует также отметить, что нет гарантии, что одна и та же строка «выиграет» против каждогострока в обновляемой таблице).

Во втором запросе, поскольку обновляемая таблица - это , указанная в предложении FROM :

Указывает, что таблица, представление или источник производной таблицы используются для предоставления критериев операции обновления.Для получения дополнительной информации см. FROM (Transact-SQL) .

Если обновляемый объект совпадает с объектом в предложении FROM и существует только одна ссылка наобъект в предложении FROM, псевдоним объекта может быть или не быть указан.

0 голосов
/ 02 марта 2012
UPDATE @tmpSelectedData   
   SET dataID = D.dataID,
       DdrID = D.DdrID,
       InrID = D.InrID
  FROM tblData D 
 INNER JOIN @tmpSelectedData SD ON SD.IprID = D.IprID 
 WHERE SD.IprID In (SELECT IprID FROM @SelectedData)

Попробуйте так ... в вашем запросе связь между @tmpSelectedData и @SelectedData отсутствует.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...