T-SQL Foreach循环

时间:2010-08-06 10:22:03

标签: sql-server-2005 tsql

方案

  • 我有一个使用SQL Server 2005用T-Sql编写的存储过程。
  • “SEL_ValuesByAssetName”
  • 它接受唯一字符串“AssetName”。
  • 返回值表。

问题

  • 我不是多次调用存储过程而是每次执行此操作时都要进行数据库调用,而是想创建另一个接受所有“AssetNames”列表的存储过程,并调用存储过程“SEL_ValueByAssetName”< strong>列表中的每个资产名称,然后返回整个值表。

伪代码

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

我将如何做到这一点?

2 个答案:

答案 0 :(得分:2)

使用存储过程看起来会非常糟糕。但你可以改用Table-Valued Functions吗?

对于表值函数,它看起来像:

SELECT al.Value AS AssetName, av.* FROM @AllAssetsList AS al
    CROSS APPLY SEL_ValuesByAssetName(al.Value) AS av

示例实施:

首先,我们需要创建一个Table-Valued Parameter类型:

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 for assets list的函数:

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)

答案 1 :(得分:0)

在MSSQL 2000中,我会将@allAssetsList设为Varchar逗号分隔值列表。 (并记住最大长度为8000)

我会在内存中创建一个临时表,解析该字符串并插入该表,然后使用条件where assetName in (select assetName from #tempTable)进行简单查询

我写了关于MSSQL 2000的文章,因为我不确定MSSQL 2005是否有一些新的数据类型,比如可以作为文字传递给SP的数组。