我有User
表,它有UserId uniqueidentifier
,名称varchar
和IsActive bit
。
我想创建存储过程以便为许多用户将IsActive设置为false,例如,如果我想要拒绝2个用户,我想将这些用户的Guid
发送到存储过程(更喜欢作为数组)。我想知道我该怎么做?
P.S。我正在使用Microsoft SQL Azure
答案 0 :(得分:2)
与Elian一样,看一下XML参数。一般来说,使用xml比使用解析字符串列表更清晰/更安全。 Click here for a code example
答案 1 :(得分:1)
这是我前一段时间使用的解决方案,并且工作正常。
将要进行deactive的guid列表发送到逗号分隔的字符串中。 然后在sp中,首先通过表值函数将此字符串转换为表。
以下是bigint的示例,但您可以轻松修改它以使其与guid一起使用
第1步:表值函数
CREATE FUNCTION [dbo].[BigIntListToTable] (
@list VARCHAR(max)
)
RETURNS
@tbl TABLE
(
nval BIGINT NOT NULL
) AS
BEGIN
DECLARE @nPos INT
DECLARE @nNextPos INT
DECLARE @nLen INT
SELECT @nPos = 0, @nNextPos = 1
WHILE @nNextPos > 0
BEGIN
SELECT @nNextPos = CHARINDEX(',', @list, @nPos + 1)
SELECT @nLen = CASE WHEN @nNextPos > 0
THEN @nNextPos
ELSE LEN(@list) + 1
END - @nPos - 1
INSERT @tbl (nval)
VALUES (CONVERT(BIGINT, SUBSTRING(@list, @nPos + 1, @nLen)))
SELECT @nPos = @nNextPos
END
RETURN
END
第2步:存储过程
CREATE PROCEDURE [dbo].[spMySP]
@IdList VARCHAR(max)
AS
BEGIN
SET NOCOUNT ON;
SET ROWCOUNT 0
UPDATE dbo.YourTable
SET isActive = 0
FROM dbo.YourTable
INNER JOIN dbo.BigIntListToTable(@IdList) l
ON dbo.YourTable.id = l.nval
END