单个变量由存储过程中的字符数组成?

时间:2013-09-13 15:28:34

标签: sql arrays tsql stored-procedures sql-server-2008-r2

CREATE PROCEDURE Testing1
@Varaible nvarchar(50),
@value integer
AS
BEGIN
DECLARE @SUMM FLOAT
SET @SUMM=(@value*2.38/7.456)*2
PRINT @Varaible
PRINT 'EXPENSES IS'
PRINT @SUMM
END
Output is:
PETER
EXPENSES IS
24.2597

以上是我传递单个输入参数的代码。

如果我想传递多个值,例如peter,robber,licoln,mat

@varaible peter,robber,licoln,mat

@value 37 45 66 77  是不是可以在SQL ??

2 个答案:

答案 0 :(得分:2)

如果您只在分隔字符串中发送一些值,我建议您只使用正确的数据类型并使用单个值调用存储过程几次。

但是,如果您的分隔字符串可能包含数百或数千个离散值,那么在性能方面多次调用proc可能会很昂贵,特别是如果您不能一次性发送它们(我是确定你想使用参数而不是一个巨大的连接命令)。如果是这种情况,您可以选择以下几种方法:

  • 使用Table Valued Parameters。这就像将数组作为参数传递给proc。
  • Pass XML to your proc,然后在程序中粉碎并处理它。
  • 将数据插入staging / temp表,然后调用该过程对这些表进行操作。
  • 退后一步,看看在您的应用中进行更多处理是否有意义。数据库代码通常不像应用程序代码那样扩展。
  • 将这些分隔的字符串发送到proc split/parse them,然后在SQL中循环结果。这似乎是你所要求的,并且可能是最不优雅的选择,即使它是滥用关系数据库的一种比较流行的方式。

答案 1 :(得分:0)

表值参数方法似乎非常“平易近人”,但仅在MSSQL 2008中可用。如果您仍然坚持使用MSSQL 2005,那么,临时表方法最适合您吗?

您的代码可能类似于:

-- define your stored procedure
CREATE PROC sptest1 AS 
BEGIN
  -- do some stuff with #tmp, like join it to other tables
  -- and UPDATE values in these tables with it!
  -- or simply list a processed version of #tmp:
  SELECT nam,val*(2.38/7.456)*2 FROM #tmp
END

-- prepare input values by creating a temporary table on the fly
SELECT 'Peter' nam,23 val  INTO #tmp
UNION ALL SELECT 'Paul',27
UNION ALL SELECT 'Harry',16
UNION ALL SELECT 'Mary-Ann',45;

-- and call the procedure:
EXEC sptest1

因此,您的前端必须构建SELECT ... INTO #tmp ...字符串。之后,其余的处理可以在您的存储过程中完成。