#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