Это будет выглядеть довольно изуродованным при использовании хранимых процедур.Но можете ли вы вместо этого использовать Табличные функции ?
В случае табличных функций это будет выглядеть примерно так:
SELECT al.Value AS AssetName, av.* FROM @AllAssetsList AS al
CROSS APPLY SEL_ValuesByAssetName(al.Value) AS av
Пример реализации:
Прежде всего нам нужно создать Табличный параметр тип:
CREATE TYPE [dbo].[tvpStringTable] AS TABLE(Value varchar(max) NOT NULL)
Затем нам нужна функция для получения значенияконкретный актив:
CREATE FUNCTION [dbo].[tvfGetAssetValue]
(
@assetName varchar(max)
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter references here
SELECT 0 AS AssetValue
UNION
SELECT 5 AS AssetValue
UNION
SELECT 7 AS AssetValue
)
Далее, функция для возврата списка AssetName, AssetValue для списка активов:
CREATE FUNCTION [dbo].[tvfGetAllAssets]
(
@assetsList tvpStringTable READONLY
)
RETURNS TABLE
AS
RETURN
(
-- Add the SELECT statement with parameter references here
SELECT al.Value AS AssetName, av.AssetValue FROM @assetsList al
CROSS APPLY tvfGetAssetValue(al.Value) AS av
)
Наконец, мы можем проверить это:
DECLARE @names tvpStringTable
INSERT INTO @names VALUES ('name1'), ('name2'), ('name3')
SELECT * FROM [Test].[dbo].[tvfGetAllAssets] (@names)