GVi*_*i82 20 sql sql-server parameters select stored-procedures
我有一个带有以下参数的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 --
Run Code Online (Sandbox Code Playgroud)
我想知道是否可以传递select参数的结果:
exec SaveDate (SELECT player.UserID,player.ServiceID, 'no','no',GETDATE()
FROM player)
Run Code Online (Sandbox Code Playgroud)
我试过这样的东西,但它不起作用.
Vla*_*lav 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, ...
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
您在示例中编写的SELECT查询可能会带回多行(您的SELECT不包含WHERE子句或TOP(n)).如果您的目的是让您的过程使用"表格式"参数集,则可以使用表值参数从SQL Server 2008开始.
这涉及创建用户定义的表表,并且几乎无疑意味着调整存储过程内的逻辑.
希望这可以帮助 :)
有关 详细信息,请参阅http://msdn.microsoft.com/en-us/library/bb510489(SQL.100).aspx.