我有一个带有以下参数的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)
我尝试过类似的东西,但它不起作用。
答案 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 了解更多信息。