Reputation: 972
I am trying to swap the selected rows as a quick way for users to selected the opposite to what they have already selected.
For example:
Current Selection:
ID SelectedUID
------------------
1
2
3 CJ
4
5
SWAP Selection: (this is what I am trying to achieve)
ID SelectedUID
------------------
1 CJ
2 CJ
3
4 CJ
5 CJ
Is there a function or an easy way to do this in SQL Server?
EDIT
Would this be an appropriate Stored Procedure? I am receiving an error when I execute this.
CREATE PROCEDURE [dbo].[ProcSWAPSelections]
@FROMCLAUSE AS VARCHAR(8000),
@UPDATETABLE AS VARCHAR(50),
@GUID AS VARCHAR(3),
@WHERECLAUSE AS VARCHAR(8000)
AS
BEGIN
SET NOCOUNT ON;
DECLARE @SQL NVARCHAR(MAX);
SET @SQL = N'UPDATE ' + @UPDATETABLE + '
SET Selected' + @GUID + '.UID = CASE WHEN Selected' + @GUID + '.UID = @GUID
THEN NULL
ELSE @GUID
END
' + @FROMCLAUSE + '
' + @WHERECLAUSE + ';';
EXEC sp_executesql @sql, N'@FROMCLAUSE VARCHAR(8000), @UPDATETABLE VARCHAR(50), @GUID VARCHAR(3), @WHERECLAUSE VARCHAR(8000)', @FROMCLAUSE,@UPDATETABLE, @GUID, @WHERECLAUSE;
END
Upvotes: 0
Views: 77
Reputation: 1581
This function should help.
CREATE FUNCTION udf_SwapValues
(
@InputStr VARCHAR(5),
@ReplaceStr1 VARCHAR(5),
@ReplaceStr2 VARCHAR(5)
)
RETURNS VARCHAR(5)
AS
BEGIN
DECLARE @Return VARCHAR(5)
SELECT @Return = CASE
WHEN @InputStr = @ReplaceStr1 THEN @ReplaceStr2
WHEN @InputStr = @ReplaceStr2 THEN @ReplaceStr1
ELSE @InputStr
END
-- Return the result of the function
RETURN @Return
END
GO
USAGE:
DECLARE @table TABLE (ID INT,
SelectedUID VARCHAR(5))
INSERT INTO @table
VALUES (1, ''),
(2, ''),
(3, 'CJ'),
(4, ''),
(5, '')
SELECT ID,SelectedUID
FROM @table
--USAGE WITH SELECT
SELECT ID,
dbo.udf_SwapValues(SelectedUID, 'CJ', '')
FROM @table
--USAGE WITH UPDATE
UPDATE t
SET t.SelectedUID = dbo.udf_SwapValues(t.SelectedUID, 'CJ', '')
FROM @table t
SELECT *
FROM @table
Upvotes: -1
Reputation: 432662
Assuming only 2 different values in the table in one update, which means you don't need a transaction to span multiple UPDATEs
UPDATE
SomeTable
SET
SelectedUID = CASE WHEN SelectedUID <> 'CJ' THEN 'CJ' ELSE '' END
or...
SelectedUID = CASE WHEN SelectedUID = 'CJ' THEN '' ELSE 'CJ' END
or...
SelectedUID = CASE WHEN SelectedUID = 'CJ' THEN NULL ELSE 'CJ' END
Upvotes: 2
Reputation: 20330
Another way would be to have a third table
Selections
ID Selection
1 NULL
2 CJ
Then in the swap table link to it, then you only need to switch in the selections table. Same number of operations, but only two records updated.
Upvotes: 3
Reputation: 33581
You can do this easily with 2 updates.
Update YourTable Set SelectedUID = 'SomeValueThatDoesntExist'
where SelectedID = 'CJ'
Update YourTable Set SelectedUID = 'CJ'
where SelectedID = 'SomeValueThatDoesntExist'
Upvotes: 2