SQL Server: 在存储过程中将多个值存储在变量中

8 浏览
0 Comments

SQL Server: 在存储过程中将多个值存储在变量中

我正在尝试在我的存储过程中向一个变量添加多个值。

我的要求是将多个值存储在一个变量中,并在以后再次使用它来删除这些值。

DECLARE @EmpID
SET @EmpID = (SELECT e.id 
              FROM employee e,Technology t
              WHERE e.status = 'InActive'
                AND e.id = t.Mainid
              UNION
              SELECT e.id 
              FROM employee e,Technology t
              WHERE e.status = 'InActive'
                AND e.id = t.AssociateID)
DELETE FROM Technology
WHERE Mainid IN (@EmpID) OR AssociateID IN (@EmpID)

当我尝试这个查询时,出现了一个错误

子查询返回多个值。当子查询跟随=,!=,<,<=,>,>=或子查询用作表达式时,不允许这样做。

0
0 Comments

问题的原因是不能将变量视为数组,需要使用表变量或临时表。解决方法是使用表变量或临时表,并通过join语法将多个值存储在变量中。另外,还可以直接删除行而不需要存储行的ID。可以使用exists关键字与Employees表进行关联来删除行。可以通过运行select * from语句验证要删除的行。可以简化查询条件,使用e.id in (t.mainId, t.associateId)来代替exists关键字。需要注意查询的执行计划,可能会产生索引扫描而不是索引查找。最后,感谢回答者的帮助。

0
0 Comments

问题的出现原因是需要在存储过程中存储多个值以供以后使用。

解决方法是使用XML数据类型来实现。首先,创建一个表来存储需要的值,然后使用INSERT语句将值插入表中。接下来,使用嵌套的SELECT语句和UNION运算符来选择满足条件的值,并将结果存储在一个XML变量中。最后,使用DELETE语句从表中删除满足条件的值。

以下是实现这个解决方法的完整代码:

SET NOCOUNT ON;
DECLARE @table1 TABLE ( id int, [status] varchar(10) );
    INSERT INTO @table1 VALUES ( 1, 'InActive' ), ( 2, 'Active' );
DECLARE @table2 TABLE ( AssociateID int, MainID int );
    INSERT INTO @table2 VALUES ( 1, 1 ), ( 2, 2 );
DECLARE @xml xml = (
    SELECT * FROM (
        SELECT
            e.id 
        FROM @table1 AS e, @table2 AS t
        WHERE 
            e.[status] = 'InActive'
            AND e.id = t.MainID
        UNION
        SELECT
            e.id 
        FROM @table1 AS e, @table2 AS t
        WHERE
            e.[status] = 'InActive'
            AND e.id = t.AssociateID
    ) AS x
    FOR XML PATH ( '' ), ROOT ( 'employeeIds' )
);
DELETE FROM @table2 WHERE MainID IN (
    SELECT x.f.value( '.', 'int' ) FROM @xml.nodes( '//employeeIds/id' ) x( f )
) OR AssociateID IN (
    SELECT x.f.value( '.', 'int' ) FROM @xml.nodes( '//employeeIds/id' ) x( f )
);

这个解决方法使用表变量和XML变量来存储和操作多个值,而不是简单地使用一个变量来存储多个值。这样可以更灵活地处理多个值,并且不会受到变量类型和长度的限制。

希望这个解决方法能够帮助到你。如果有任何问题,请随时提问。

0