28

我有一个带有以下参数的 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 --

我想知道是否可以传递selectas 参数的结果:

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

我尝试过这样的事情,但它不起作用。

4

2 回答 2

19

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.另一种方法是定义自己的表类型,填充它,并将其传递给过程。但是,这需要稍微更改您的存储过程(在参数列表中,您的自定义类型应该跟在后面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
于 2013-07-30T07:23:23.120 回答
8

您在示例中编写的 SELECT 查询可能会带回多行(您的 SELECT 没有 WHERE 子句或 TOP(n))。如果您的意图是让您的过程能够使用一组“表格”参数,则从 SQL Server 2008 开始,您可以使用表值参数。

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

希望这可以帮助 :)

有关详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb510489(SQL.100).aspx

于 2012-12-31T11:27:59.267 回答