我可以将参数数组发送到存储过程吗?

时间:2011-05-11 03:36:45

标签: sql-server stored-procedures azure azure-sql-database

我有User表,它有UserId uniqueidentifier,名称varchar和IsActive bit

我想创建存储过程以便为许多用户将IsActive设置为false,例如,如果我想要拒绝2个用户,我想将这些用户的Guid发送到存储过程(更喜欢作为数组)。我想知道我该怎么做?

P.S。我正在使用Microsoft SQL Azure

2 个答案:

答案 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