Оставляя в стороне оговорки об использовании динамического SQL, мне интересно, могу ли я динамически объявлять, какую локальную переменную я хочу присвоить значение данной выходной переменной из динамического оператора SQL.Назначение динамических выходных переменных SQL для локальных переменных
Надеюсь, я сказал, что достаточно хорошо. Вот немного кода и где у меня проблемы. У меня есть хранимая процедура с рядом выходных параметров, например, так:
ALTER PROCEDURE [dbo].[mngi_psi_paginate]
@image_desc_1 VARCHAR(50) OUTPUT
,@image_desc_2 VARCHAR(50) OUTPUT
,@image_desc_3 VARCHAR(50) OUTPUT
,@image_desc_4 VARCHAR(50) OUTPUT
,@image_desc_5 VARCHAR(50) OUTPUT
,@image_desc_6 VARCHAR(50) OUTPUT
,@image_desc_7 VARCHAR(50) OUTPUT
,@image_desc_8 VARCHAR(50) OUTPUT
,@image_desc_9 VARCHAR(50) OUTPUT
,@image_desc_10 VARCHAR(50) OUTPUT
...
Есть в общей сложности 40 выходных параметров. Я разрешаю пользователю просматривать неизвестное количество изображений, по 10 изображений за раз. Для каждого изображения мне нужны 4 поля данных, но с потенциалом по 10 записей за раз, я бы предпочел не кодировать все 40 назначений переменных.
Я понимаю, что должны быть лучшие способы сделать это, но получающее приложение не является веб-браузером, поэтому, к сожалению, это то, с чем мне нужно работать.
Я также делаю несколько других вещей: определите общее количество изображений, количество страниц и количество изображений, которые будут отображаться на странице.
Как только я выясню, какой набор изображений принадлежит данной странице, я помещаю их во временную таблицу.
CREATE TABLE #images_page
(primary_key INT IDENTITY(1,1) NOT NULL
,image_id VARCHAR(36)
,image_path VARCHAR(400)
,image_type VARCHAR(5)
,image_desc VARCHAR(MAX)
)
INSERT INTO #images_page
SELECT image_id
,image_path
,image_type
,image_desc
FROM @images_set
WHERE primary_key >= @image_start
AND primary_key <= @image_end
Тогда я построить строку выполнить динамический оператор SQL, который все завернутый в цикле WHILE, с надеждой на возможность назначать только переменные, которые имеют соответствующую запись (например, @ image_desc_1 получает данные из строки # 1, @ image_desc_2 получает данные из строки # и т.д.
SELECT @image_page_total = COUNT(*)
FROM #images_page
DECLARE @row_counter INT
,@loop_counter INT
SET @loop_counter = @image_page_total
SET @row_counter = 1
WHILE
@loop_counter > 0
AND @row_counter <= @loop_counter
BEGIN
-- Dynamically assign variables
DECLARE @sql NVARCHAR(MAX)
DECLARE @params NVARCHAR(MAX)
DECLARE @assign NVARCHAR(MAX)
SELECT @sql = 'SELECT @image_desc = image_desc ' +
'@image_path = image_path,' +
'@image_type = image_type,' +
'@image_comments = image_comments' +
'FROM #images_page ' +
'WHERE primary_key = ' + CAST(@row_counter AS VARCHAR)
SELECT @params = '@image_desc varchar(50) OUTPUT'
SELECT @assign = '@image_desc = @image_desc_' + CAST(@row_counter AS VARCHAR) + ' OUTPUT'
--This line works because I've simply typed out the variable name
EXEC sp_executesql @sql, @params, @image_desc = @image_desc_1 OUTPUT
--This line does not work because I am trying to append the '_1' to @image_desc
EXEC sp_executesql @sql, @params, @assign
SET @row_counter = @row_counter + 1
END
Первый EXEC sp_executesql линия работает, потому что это так, как это должно работать, и это, как вы видите его во всей документации и примеры. Второй EXEC sp_executesql - это то, что я действительно хотел бы сделать, но я просто не могу понять, как это сделать.
Есть ли способ сделать это так, как я пытаюсь это сделать?
Я открыт для альтернативных методов, которые не требуют от меня жесткого кодирования назначений переменных.
Заранее благодарю за помощь!
Я боялся, что собирался быть ответом. Я вижу, что я могу динамически строить имя переменной в строке SQL, но на самом деле не имеет значения, не могу ли я ее динамически не передавать. Я сыграю с несколькими другими вариантами и дам вам знать, что я придумал. Я очень ценю ваш ответ на это. Живи долго и процветай! Я знаю - ты никогда не слышал этого раньше. Извините, я не мог удержаться. :-) –
Что делать, если вы вернете его с заявлением об объединении? Тогда тот, который получил набор динамически, будет тем, который возвращается? – Spock
Где я предлагаю? В третьем параметре sp_expectutesql или где-то еще? –