【问题标题】:Can I send array of parameter to store procedure?我可以将参数数组发送到存储过程吗?
【发布时间】:2011-05-11 03:36:45
【问题描述】:

我有 User 表,它有 UserId uniqueidentifier、Name varchar 和 IsActive bit

我想为许多用户创建存储过程以将 IsActive 设置为 false,例如,如果我想停用 2 个用户,我想将这些用户中的 Guid 发送到存储过程(首选数组)。我想知道我该怎么做?

附:我正在开发 Microsoft SQL Azure

【问题讨论】:

  • 和SQL Server 2008基本一样吗?那里有表值参数可用吗?
  • @Martin:我不知道表值参数,但从blogs.staykov.net/2011/04/… 我认为它们存在 SQL Azure。

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


【解决方案1】:

按照与 Elian 相同的思路,看看 XML 参数。一般来说,与解析字符串列表相比,您应该使用 xml 实现更清晰/更安全的实现。 Click here for a code example

【讨论】:

  • 显然,这是我们目前不使用的方法。它真的很有效,而且效果很好!
【解决方案2】:

这是我不久前使用的一个解决方案,效果很好。

将要停用的 guid 列表合并成逗号分隔的字符串发送到 sp。 然后在 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

第二步:存储过程

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多