Может ли в хранимой процедуре SQL Server использоваться цикл для доступа к значениям нескольких параметров, если параметры названы одинаково? - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть хранимая процедура, которая должна запрашивать на основе выбора пользователя.Хранимая процедура принимает три параметра GUID (выбранных пользователем) и хранит каждый GUID в своей собственной переменной с именем '@GUID_X', где X будет целым числом в диапазоне [1-15).

Хранимая процедура должна запрашивать эти значения GUID, и поскольку в именах переменных есть шаблон, я хотел бы использовать цикл для перебора переменных для доступа к их значениям, а затем вставлять каждое значение взапрос.

До сих пор я пытался объединить '@GUID_' + 'номер счетчика' и получил список значений, таких как:

@FoodGUID_3
@FoodGUID_2
@FoodGUID_1

Когда на самом деле я ожидалсписок, который выглядел как:

ABABABA1-FGH-1234-ZX12-123456EDVERT
GHDF1234-CVB-4312-CV15-678912NK1284
VBNM5678-BVC-2134-BN18-852741DC1434

Почему я не могу получить доступ к фактическим значениям GUID объявленных @FoodGUID_X аргументов?Что было бы лучшим способом решения этой проблемы?В идеале подход не заключался бы в использовании предложения «if» для каждого аргумента, поскольку это может быть дорого!

Для ссылки.вот мой полный код:

DECLARE @foodGUID_1 NVARCHAR(360) = N'ABABABA1-FGH-1234-ZX12-123456EDVERT',
        @foodGUID_2 NVARCHAR(360) = N'GHDF1234-CVB-4312-CV15-678912NKOMLP',
        @foodGUID_3 NVARCHAR(360) = N'VBNM5678-BVC-2134-BN18-852741DCFVGB'

DECLARE @SelectSQL NVARCHAR(2500) = 'Query string  + '
DECLARE @NumOfFoodsSelected INT = 3
DECLARE @counter INT = @NumOfFoodsSelected
DECLARE @currentGUID NVARCHAR(360)

SET @currentGUID  = '@DeviceGUID_'+ CONVERT(NVARCHAR(15), @counter)

PRINT @currentGUID

WHILE (@counter != 1)
BEGIN
    SET @counter = @counter - 1
    SET @currentGUID  = '@DeviceGUID_'+ CONVERT(NVARCHAR(15), @counter)
    PRINT @currentGUID
END

Заранее спасибо за любую помощь!:)

Ответы [ 2 ]

0 голосов
/ 25 сентября 2019

A конструктор табличных значений может использоваться для доступа к именам и значениям:

DECLARE     @foodGUID_1 NVARCHAR(360) = N'ABABABA1-FGH-1234-ZX12-123456EDVERT',
            @foodGUID_2 NVARCHAR(360) = N'GHDF1234-CVB-4312-CV15-678912NKOMLP',
            @foodGUID_3 NVARCHAR(360) = N'VBNM5678-BVC-2134-BN18-852741DCFVGB';

select VariableValue
  from ( values
    ( '@foodGUID_1', @foodGUID_1 ),
    ( '@foodGUID_2', @foodGUID_2 ),
    ( '@foodGUID_3', @foodGUID_3 )
    ) as foodGUIDs( VariableName, VariableValue )
  where VariableName = '@foodGUID_2';

Предложение where может быть where VariableName = '@foodGUID_' + Cast( @Counter as VarChar(2) ) для перебора значений методом перебора.Значение можно извлечь из переменной, используя select @foodGUID = VariableValue from ...

Конструктор табличных значений можно использовать в различных запросах в виде производной таблицы , например, для insert нескольких строк встол или как одна сторона join в select.

0 голосов
/ 25 сентября 2019

вы можете использовать UDT в качестве параметра вашей хранимой процедуры для хранения ваших GUID.

Таким образом, ваш скрипт будет выглядеть следующим образом.

declare @goodGuids table (
    id int identity(1, 1), 
    foodguid NVARCHAR(360)
);

insert into @goodGuids(foodguid) values
        (N'ABABABA1-FGH-1234-ZX12-123456EDVERT'),
        (N'GHDF1234-CVB-4312-CV15-678912NKOMLP'),
        (N'VBNM5678-BVC-2134-BN18-852741DCFVGB')

select 'DeviceGUID_' + foodguid from @goodGuids
...