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前缀是怎么回事,因为我最近才开始使用这个数据库。所有的程序都使用它。