Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/blackberry/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2005 为列中的每个值调用过程?_Sql Server 2005 - Fatal编程技术网

Sql server 2005 为列中的每个值调用过程?

Sql server 2005 为列中的每个值调用过程?,sql-server-2005,Sql Server 2005,我有一个从数据库中删除用户的过程: CREATE PROCEDURE [dbo].[sp_removeUser] @UserId uniqueidentifier ,@result int OUT AS BEGIN SET NOCOUNT ON SET @Result=0 -- whether User exists IF NOT EXISTS(SELECT 1 FROM [dbo].[Users]

我有一个从数据库中删除用户的过程:

CREATE PROCEDURE [dbo].[sp_removeUser]
     @UserId        uniqueidentifier    
    ,@result        int OUT
AS
BEGIN  
 SET NOCOUNT ON     
    SET @Result=0

    -- whether User exists 
    IF NOT EXISTS(SELECT 1 FROM [dbo].[Users] (nolock) WHERE UserId = @UserId)  
        RETURN  

    -- Prevent to remove admin
    IF EXISTS(SELECT 1 FROM [dbo].[aspnet_Users] (nolock) WHERE UserId= @UserId AND UserName = 'admin' )
        RETURN


    BEGIN TRAN

    -- Remove User Addresses
    DELETE FROM [dbo].[AddressesUserAccess] WHERE AddressId IN (SELECT AddressId FROM Addresses WHERE UserId = @UserId)
    DELETE FROM [dbo].[AddressesInGroups] WHERE AddressId IN (SELECT AddressId FROM Addresses WHERE UserId = @UserId)
    DELETE FROM [dbo].[Addresses] WHERE UserId = @UserId

    -- Remove User Numbers  
    DELETE FROM [dbo].[NumbersUserAccess] WHERE NumberId IN (SELECT NumberId FROM Numbers WHERE UserId = @UserId)
    DELETE FROM [dbo].[NumbersInGroups] WHERE NumberId IN (SELECT NumberId FROM Numbers WHERE UserId = @UserId)
    DELETE FROM [dbo].[Numbers] WHERE UserId = @UserId

...
... and lots more below...
...
我想删除一大堆用户,所以我的第一个想法是得到一列我想删除的所有用户ID,然后迭代,依次删除每个用户

然而,在阅读了其他一些关于如何做到这一点的问题后,我明白这不是首选的方式,相反,我应该寻找一种更基于集合的解决方案


那么,有什么更好的方法来实现此过程,使其以更基于集合的方式工作呢?

您可以使用拆分函数,例如

CREATE FUNCTION dbo.SplitGUIDs
(
   @List       VARCHAR(MAX)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(UNIQUEIDENTIFIER, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'VARCHAR(36)')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, ',', '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );
GO
您可能必须从应用程序层或其他地方构建以逗号分隔的GUID列表,但您可以这样调用该过程:

EXEC dbo.RemoveUsers 
@UserList = '89E31B4B-68B5-4B7B-B226-F51BE388F815,C947AE20-DEC1-4EBC-A838-CCCE033BD1FF'

只需注意,如果任何元素不是有效的GUID,它将爆炸。

您可以使用拆分函数,例如

CREATE FUNCTION dbo.SplitGUIDs
(
   @List       VARCHAR(MAX)
)
RETURNS TABLE
AS
   RETURN 
   (
       SELECT Item = CONVERT(UNIQUEIDENTIFIER, Item)
       FROM
       (
           SELECT Item = x.i.value('(./text())[1]', 'VARCHAR(36)')
           FROM
           (
               SELECT [XML] = CONVERT(XML, '<i>' 
                    + REPLACE(@List, ',', '</i><i>') 
                    + '</i>').query('.')
           ) AS a
           CROSS APPLY
           [XML].nodes('i') AS x(i)
       ) AS y
       WHERE Item IS NOT NULL
   );
GO
您可能必须从应用程序层或其他地方构建以逗号分隔的GUID列表,但您可以这样调用该过程:

EXEC dbo.RemoveUsers 
@UserList = '89E31B4B-68B5-4B7B-B226-F51BE388F815,C947AE20-DEC1-4EBC-A838-CCCE033BD1FF'

请注意,如果任何元素不是有效的GUID,它将爆炸。

SQL Server的哪个版本?如果2008年,你可以在TVP中传递一个用户ID列表。我的开发机器是2008年,但我们的live server是2005年,这有点令人恼火。SQL server的哪个版本?如果2008年,你可以在TVP中传递一个用户ID列表。我的开发机器是2008年,但我们的实时服务器是2005年,这有点烦人。谢谢,这看起来很有用。我真的不知道sp_uu前缀是怎么回事,因为我最近才开始使用这个数据库。所有的程序都使用它。谢谢,看起来很有用。我真的不知道sp_uu前缀是怎么回事,因为我最近才开始使用这个数据库。所有的程序都使用它。