2010-12-09 2 views
0

У меня есть таблица с двумя столбцами «имя» и «идентификатор». где ID не равен NULL.Sql Server 2005 Swap ID Numbers

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

CREATE PROCEDURE dbo.procName 
    @OldName NVARCHAR(128), 
    @NewName NVARCHAR(128) 
AS 

DECLARE @NewId0 INT, 
    @NewId1 INT, 
    @OldId0 INT, 
    @OldId1 INT, 
    @Number INT 


SELECT @NewId0 = ID FROM Table1 WHERE [Name] = @NewName 
SELECT @NewId1 = ID FROM Table1 WHERE [Name] = @NewName 
SELECT @OldId0 = ID FROM Table1 WHERE [Name] = @OldName 
SELECT @OldId1 = ID FROM Table1 WHERE [Name] = @OldName 
SELECT @Number = 0 

UPDATE Table1 SET ID = @Number WHERE ID = @NewId0 
UPDATE Table1 SET ID = @NewId1 WHERE ID = @OldId0 
UPDATE Table1 SET ID = @OldID1 WHERE ID = @NewID0 


Go 

Все, что я получаю первое имя, чтобы иметь значение 0.

Я думаю, что моя логика верна, но это, кажется, не будет работать там что-то, что мне не хватает?

+0

Если ваша таблица имеет только два столбца, почему бы не просто заменить столбцы имен? – Arvo 2010-12-09 14:48:00

ответ

3

Try что-то вроде

UPDATE Table1 
SET  ID = CASE 
        WHEN ID = @NewId 
         THEN @OldId 
        ELSE @NewId 
       END 
WHERE ID IN (@NewId, @OldId) 

Вот полный пример

DECLARE @Table TABLE(
     ID INT, 
     Name VARCHAR(20) 
) 

INSERT INTO @Table SELECT 1,'A' 
INSERT INTO @Table SELECT 2,'B' 

DECLARE @NewName VARCHAR(20), 
     @OldName VARCHAR(20) 

SELECT @NewName = 'A', 
     @OldName = 'B' 

DECLARE @NewId INT, 
    @OldId INT 


SELECT @NewId = ID FROM @Table WHERE [Name] = @NewName 
SELECT @OldId = ID FROM @Table WHERE [Name] = @OldName 

SELECT * 
FROM @Table 

UPDATE @Table 
SET  ID = CASE 
        WHEN ID = @NewId 
         THEN @OldId 
        ELSE @NewId 
       END 
WHERE ID IN (@NewId, @OldId) 

SELECT * 
FROM @Table 
+0

Это работает, но я забыл упомянуть, что ID является Первичным ключом. – andy 2010-12-09 14:27:48

0

Этот скрипт работает, если идентификатор не является основной ключ

CREATE PROCEDURE dbo.procName @OldName NVARCHAR (128), @NewName NVARCHAR (128) Как DECLARE @NewId INT,@OldId INT

ВЫБОР @NewId = Идентификатор ОТ Table1 ГДЕ [Имя] = @NewName
ВЫБОР @OldId = Идентификатор ОТ Table1 ГДЕ [Имя] = @OldName

ОБНОВЛЕНИЕ Таблица1 Set ID = СЛУЧАЙ
КОГДА ID = @NewId
ТОГДА @OldId ИНАЧЕ @NewId END WHERE ID IN (@NewId, @OldId)

SELECT * ОТ TABL e1 пойти

0

Ваш текущий код не потому, что:

  • Вы Ищут @ NewId0, и установить его на @Number (что 0)
  • Вы потом искать @ OldId0, и установить его @ NewId1
  • вы потом искать @ NewId0 снова ... но две линии назад, вы установите его в 0, так что это не в таблице больше

Мне нравится @ решение astander в (upvoted), сохраненным я пишу это mys Эльф.

НО ... ваш комментарий, «... Идентификатор является основным ключом», вызывает все виды красных флагов. Вы действительно, действительно не хотите изменять значения первичного ключа. [Вставить длинное обсуждение из прошлых классов о первичных ключах и реляционной целостности здесь].Выяснить, почему вы думаете, что вам нужно сделать это, а затем выяснить, другой способ реализации этого бизнес-требования, такие как:

  • Не изменяйте идентификаторы, изменить все остальное (название, описание, стоимость, независимо от)
  • Создайте совершенно новые записи и отбросьте (или отметьте как завершенные, освобожденные или ненужные) старые
  • Внедрение некоторой умной логики на основе основных бизнес-требований.
0

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

CREATE PROCEDURE dbo.ID @OldName NVARCHAR(128), 
         @NewName NVARCHAR(128) 

AS 
DECLARE @NewId INT, 
     @OldId INT 

CREATE TABLE TmpTable (ID INT,Name NVARCHAR(128)) 

INSERT INTO TmpTable (Name,ID) 
VALUES (@NewName,(SELECT ID FROM Table1 WHERE [Name] = @NewName)); 

INSERT INTO TmpTable (Name,ID) 
VALUES(@OldName,(SELECT ID FROM Table1 WHERE [Name] = @OldName)) 

UPDATE Table1 SET ID = 11 WHERE [NAME] = @NewName 
UPDATE Table1 SET ID = 10 WHERE [NAME] = @OldName 

UPDATE Table1 SET ID = (SELECT ID FROM TmpTable where Name = @NewName)WHERE [Name] = @OldName 
UPDATE Table1 SET ID = (SELECT ID FROM TmpTable where Name = @OldName) WHERE [Name] = @NewName 

DROP TABLE TmpTable 
go 

«11» и «10» были выбраны, поскольку они не в таблице моя следующая миссия будет запрашивать table1 и для случайное число, которое существует доцент, затем используйте это число для временного замещения идентификатора перед обновлением новых.

Thanks