Могу ли я отправить массив параметров в процедуру хранения?

#sql-server #stored-procedures #azure #azure-sql-database

#sql-server #хранимые процедуры #azure #azure-sql-database

Вопрос:

У меня есть User таблица, у нее есть идентификатор пользователя uniqueidentifier , имя varchar и она активна bit .

Я хочу создать процедуру хранения, чтобы установить для isActive значение false для многих пользователей, например, если я хочу отключить 2 пользователя, я хочу отправить Guid этих пользователей в процедуру хранения (предпочитаю в виде массива). Я хочу знать, как я могу это сделать?

P.S. Я работаю над Microsoft SQL Azure

Комментарии:

1. Это в основном то же самое, что и SQL Server 2008? Доступны ли там параметры с табличными значениями?

2. @Martin: Я не знаю о табличных параметрах, но из blogs.staykov.net/2011/04/… Я думаю, что они существуют в SQL Azure.

Ответ №1:

Аналогично Elian, взгляните на параметры XML. Вообще говоря, у вас должна быть более чистая / безопасная реализация с использованием xml, чем синтаксический анализ списка строк. Нажмите здесь для примера кода

Комментарии:

1. Очевидно, что это подход, который мы в настоящее время не используем. Это действительно работает, и работает отлично!

Ответ №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
  

Шаг 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