Обновление нескольких строк в SQL Server 2005 (v9.0.5000) - PullRequest
0 голосов
/ 15 апреля 2019

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

UPDATE d
SET Path = t.Path
FROM dbo.tableOperation d
JOIN (VALUES (1, 'Path 1'),
             (2, 'Path 2')) t (IdRegister, Path) ON t.IdRegister = d.IdRegister

И на SQL Server 2008 R2 (v10.50.1600) он работал нормально, но я обнаружил, что у синтаксиса возникают проблемы при попытке отобразить примерный план выполнения сценария на сервере, который я должен обновить данные (9.0 0,50000). Ошибка конкретно говорит

Неверный синтаксис рядом с ключевым словом «VALUES»

Мне нужно обновлять десятки тысяч строк одновременно, как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 15 апреля 2019

Возможно, вам придется перейти с VALUES() на UNION ALL на 2005 год (также будет работать в 2008 году).Но имейте в виду, что поддержка SQL Server 2005 закончилась много лет назад.(Я имею в виду, это так старо, я забыл, что VALUES() там не было.) Время двигаться дальше?

UPDATE d
SET Path = t.Path
FROM dbo.tableOperation AS d
INNER JOIN 
(
    SELECT 1,'Path 1'
    UNION ALL SELECT 2,'Path 2'
) AS t (IdRegister, Path) 
ON t.IdRegister = d.IdRegister;
0 голосов
/ 18 апреля 2019

Добрый день, Throkar,

Предполагая, что я понял ваши потребности (в чем я не совсем уверен), и поскольку вы используете значения жестких кодов, используя (VALUES (1, 'Path 1'), (2, 'Path 2')), то, возможно, простое прямое обновление может решитьваши потребности

Поскольку вы не предоставили DDL + DML, я буду использовать базовую демонстрацию

-- Let's assume that this our DDL+DML
drop table if exists tableOperation
GO
CREATE TABLE tableOperation(IdRegister int, Path varchar(100))
INSERT tableOperation(IdRegister) values (2),(4),(5)
select * from tableOperation
GO

--UPDATE d
--SET Path = t.Path
--FROM dbo.tableOperation d
--JOIN (VALUES (1, 'Path 1'),(2, 'Path 2')) t (IdRegister, Path) 
--  ON t.IdRegister = d.IdRegist

-- You can use this query
UPDATE dbo.tableOperation
SET Path = CASE   
    WHEN IdRegister = 1 then 'Path 1'
    WHEN IdRegister = 2 then 'Path 2'
END
WHERE IdRegister in (1,2)

В фильтре (условие WHERE) я использую список жестких кодов всех значений, которыеВы использовали условие ON, а в разделе SET я просто использую оператор CASE с жестким кодом условий

Может ли такой подход удовлетворить ваши потребности?

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