将选择结果作为存储过程的参数传递

时间:2012-12-31 09:38:48

标签: sql sql-server select stored-procedures parameters

我有一个带有以下参数的T-SQL存储过程

CREATE PROCEDURE [dbo].[SaveData]
-- Add the parameters for the stored procedure here
    @UserID varchar(50),
    @ServiceID varchar(50),
    @param1 varchar(50),
    @param2 varchar(50),
    @endDate datetime
AS BEGIN
    . 
    .
    -- my code --

我想知道是否可以将select的结果作为参数传递:

    exec SaveDate (SELECT player.UserID,player.ServiceID, 'no','no',GETDATE()
           FROM player)

我尝试过类似的东西,但它不起作用。

2 个答案:

答案 0 :(得分:15)

1.一种方法是:   
a)声明你的变量   
b)用一个select语句为它们赋值   
c)执行传递局部变量的过程   
d)使用WHILE或CURSOR在循环中执行以下操作,以便将其应用于TABLE1中的所有行

DECLARE @param1 <DATATYPE>, @param2 <DATATYPE>, ...

SELECT TOP 1 @param1 = col1,    @param2 = col2, ...
FROM TABLE1
WHERE <where_clause>

EXEC SaveDate @param1, @param2, ...

2.其他方法是定义自己的表类型,填充它,并将其传递给过程。但是,这需要更改您的存储过程(在params列表中,您的自定义类型后面应该跟READONLY):

CREATE TYPE [dbo].[TYPENAME] AS TABLE(
    [ID] [int] NOT NULL,
    ...
)
GO

DECLARE @myTypeVar TYPENAME;

INSERT @myTypeVar
SELECT col1, col2, ...
FROM TABLE1

EXEC SaveData @myTypeVar

答案 1 :(得分:5)

您在示例中编写的SELECT查询可能会带回多行(您的SELECT不包含WHERE子句或TOP(n))。如果您的目的是让您的程序能够使用“表格式”参数集,那么从SQL Server 2008开始,您就可以使用表值参数。

这涉及创建用户定义的表格表,几乎无疑意味着调整存储过程中的逻辑。

希望这会有所帮助:)

参见http://msdn.microsoft.com/en-us/library/bb510489(SQL.100).aspx 了解更多信息。