2
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

@变量peter,robber,licoln,mat

@value37 45 66 77 可以在 SQL 中使用吗?

4

2 回答 2

2

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

但是,如果您的分隔字符串可能包含数百或数千个离散值,那么多次调用 proc 在性能方面可能会付出高昂的代价,特别是如果您不能将它们全部发送一次(我确定您想要使用参数而不是巨大的串联命令)。如果是这种情况,您有几个选择:

  • 使用表值参数。这就像将数组作为参数传递给您的 proc。
  • 将 XML 传递给您的 proc,然后在过程中对其进行分解和处理。
  • 将您的数据插入到暂存/临时表中,然后调用该过程对这些表进行操作。
  • 退后一步,看看在您的应用程序中进行更多处理是否有意义。DB 代码的扩展性通常不如应用程序代码。
  • 将这些分隔字符串发送到您的 proc,拆分/解析它们,然后在 SQL 中循环遍历结果。这似乎是您要问的问题,并且可能是最不优雅的选择,即使它是滥用关系数据库的更流行的方法之一。
于 2013-09-13T15:54:40.870 回答
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 ...字符串。之后,其余的处理可以在您的存储过程中完成。

于 2013-09-13T17:28:45.930 回答