Цикл T-SQL Foreach - PullRequest
       10

Цикл T-SQL Foreach

2 голосов
/ 06 августа 2010

Сценарий

  • У меня есть хранимая процедура, написанная на T-Sql с использованием SQL Server 2005.
  • "SEL_ValuesByAssetName"
  • Принимает уникальную строку "AssetName".
  • Возвращает таблицу значений.

Вопрос

  • Вместо многократного вызова хранимой процедуры и необходимости каждый раз выполнять вызов базы данных.Я делаю это, я хочу создать другую хранимую процедуру, которая принимает список всех «AssetNames» и вызывает хранимую процедуру «SEL_ValueByAssetName» для каждого имени ресурса в списке, а затем возвращает ВСЯ ТАБЛИЦА ЗНАЧЕНИЙ.

Псевдокод

foreach(value in @AllAssetsList)
{
@AssetName = value
SEL_ValueByAssetName(@AssetName)
UPDATE #TempTable
}

Как мне поступить?

Ответы [ 2 ]

2 голосов
/ 06 августа 2010

Это будет выглядеть довольно изуродованным при использовании хранимых процедур.Но можете ли вы вместо этого использовать Табличные функции ?

В случае табличных функций это будет выглядеть примерно так:

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)
0 голосов
/ 06 августа 2010

В MSSQL 2000 я бы сделал @allAssetsList списком значений, разделенных запятыми Varchar. (и имейте в виду, что максимальная длина составляет 8000)

Я бы создал временную таблицу в памяти, проанализировал эту строку и вставил в эту таблицу, а затем выполнил бы простой запрос с условием where assetName in (select assetName from #tempTable)

Я писал о MSSQL 2000, потому что я не уверен, есть ли в MSSQL 2005 какой-то новый тип данных, например, массив, который можно передать в виде литерала в SP.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...