繁体   English   中英

交换SQL Server中的选定行

[英]SWAP Selected Rows in SQL Server

我正在尝试交换选定的行,以便用户选择与其选择的行相反的一种快速方法。

例如:

当前选择:

ID    SelectedUID
------------------
1         
2         
3         CJ
4         
5         

SWAP选择:(这是我要实现的目标)

ID    SelectedUID
------------------
1         CJ
2         CJ
3         
4         CJ
5         CJ

在SQL Server中是否有功能或简单的方法可以做到这一点?

编辑

这将是适当的存储过程吗? 执行此操作时收到错误。

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

另一种方法是拥有第三张桌子

Selections
ID Selection
1  NULL
2  CJ

然后在交换表链接到它,然后只需要切换选择表。 相同的操作次数,但仅更新了两条记录。

您可以轻松进行2次更新。

Update YourTable Set SelectedUID = 'SomeValueThatDoesntExist'
where SelectedID = 'CJ'

Update YourTable Set SelectedUID = 'CJ'
where SelectedID = 'SomeValueThatDoesntExist'

假设一次更新中表中只有2个不同的值,这意味着您不需要跨多个UPDATE的事务

UPDATE
   SomeTable
SET
   SelectedUID = CASE WHEN SelectedUID <> 'CJ' THEN 'CJ' ELSE '' END

要么...

   SelectedUID = CASE WHEN SelectedUID = 'CJ' THEN '' ELSE 'CJ' END

要么...

   SelectedUID = CASE WHEN SelectedUID = 'CJ' THEN NULL ELSE 'CJ' END

此功能应有帮助。

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

用法:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM