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

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)


Mar*_*rkD 6

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

这涉及创建用户定义的表表,并且几乎无疑意味着调整存储过程内的逻辑.

希望这可以帮助 :)

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