Concat param名称循环参数

时间:2012-05-03 15:13:48

标签: sql tsql sql-server-2008-r2

我有一个接受多个varchar(4000)参数的程序(其中26个)。

每个都是以逗号分隔的值字符串。

一旦传入它们,我想将每个字符串分开并将它们插入临时表中,以便稍后在proc中使用。

我不想编写一个单独处理每个参数的语句,而是编写一个依赖于计数器的while循环来遍历每个参数并依次处理每个参数。目前,我已尝试过以下内容,但不正确。

CREATE PROCEDURE [dbo].[myproc] (
    @string1 varchar(4000) = null;
    @string2 varchar(4000) = null;
    @string3 varchar(4000) = null;
    ....declare @string4 -> @string25...
    @string26 varchar(4000) = null;)

CREATE TABLE #emails (
    address varchar(80)
     )

Set @counter = 1

WHILE @counter < 27
BEGIN
INSERT INTO #emails(address) SELECT element as address from FT_SPLIT_LIST(isNull('@string'+convert(varchar,@counter),''),',')
SET @counter = @counter +1
END

SELECT * FROM #emails

目前,这不会返回包含@ string1 - &gt;中所有CSV的表格。 @ string26。

FT_SPLIT_LIST有效 - 我在很多其他地方使用它。我只需要知道是否有办法动态声明传入的参数?

如果没有为每个@ string1-&gt; @ string27参数编写声明,有没有办法做我想要完成的事情?

谢谢, ç

1 个答案:

答案 0 :(得分:2)

SQL Server 2008及更高版本具有table valued parameters

  

使用用户定义的表类型声明表值参数。您可以使用表值参数将多行数据发送到Transact-SQL语句或例程(例如存储过程或函数),而无需创建临时表或许多参数。

这是比逗号分隔的varchars和FT_SPLIT_LIST更好的选择。

我建议阅读Erland Sommarskog撰写的Arrays and Lists in SQL Server 2008 Using Table-Valued Parameters,以便对该主题进行全面讨论。