使用select作为参数执行存储过程

时间:2013-03-06 13:24:00

标签: sql-server stored-procedures exec

我在sql server上有一个存储过程,它有2个参数。我想为select返回的每一行运行stp。

CREATE PROCEDURE stpMySTP @param1, @param2
AS BEGIN
   --select something from database regarding this parameters
END

我想运行此stp并传递select语句返回的@param2参数列表。

类似的东西:

   EXEC stpMySTP '',(SELECT ....)

有什么想法吗?

2 个答案:

答案 0 :(得分:2)

如果我正确地阅读了这个问题(我可能不会):::

这是光标可能解决方案之一。但是,游标通常是可怕的解决方案。

USE [Northwind]
GO


/*  uspCustomerGetSingleWithOrders 'SIMOB'  */

CREATE  PROCEDURE [dbo].[uspCustomerGetSingleWithOrders]  (
    @customerId varchar(12)
)

AS 

SET NOCOUNT ON 


Select 
    --CustomerID ,
    --ContactName , 
    --City
    CustomerID,CompanyName,ContactName,ContactTitle,Address,City,Region,PostalCode,Country,Phone,Fax
from 
    dbo.Customers

WHERE
    LTRIM(RTRIM(UPPER(CustomerID))) = LTRIM(RTRIM(UPPER(@customerId)))


Select 
    OrderID,CustomerID,EmployeeID,OrderDate,RequiredDate,ShippedDate,ShipVia,Freight,ShipName,ShipAddress,ShipCity,ShipRegion,ShipPostalCode,ShipCountry
from 
    dbo.Orders o
WHERE
    LTRIM(RTRIM(UPPER(o.CustomerID))) = LTRIM(RTRIM(UPPER(@customerId)))

SET NOCOUNT OFF


GO

现在是一个游标(:<)

Use Northwind

GO


declare @PROC_fetch_status int


declare @CustomerID varchar(12)
declare @ContactName varchar(24)


--    Select * from Customers
DECLARE curCustomers CURSOR FAST_FORWARD FOR select CustomerID , ContactName
from Customers Order by ContactName
OPEN curCustomers


-- Perform the first fetch.
fetch curCustomers into @CustomerID , @ContactName


select @PROC_fetch_status = @@fetch_status

    IF @PROC_fetch_status <> 0
 begin
  print 'No Records'
 end

    WHILE @PROC_fetch_status = 0
    BEGIN

        print 'Current Customer  = ' + @CustomerID + '  :  ' + @ContactName
        print '------------------------------------'
        print ''
        EXEC dbo.uspCustomerGetSingleWithOrders @CustomerID
        print ''
        print ''

        FETCH NEXT FROM curCustomers INTO @CustomerID , @ContactName
        select @PROC_fetch_status = @@fetch_status

    END
CLOSE curCustomers
DEALLOCATE curCustomers

但是我建议阅读“基于集合”而不是“按行划分”的哲学。 如果您有兴趣,请留言。

答案 1 :(得分:1)

我建议如下:

  1. 如果您的参数列表很简单,那么使用字符串作为@param2。喜欢'| 1 | 2 | 100500 |'。然后使用该过程拆分字符串并使用这些参数
  2. 如果您的prosedure返回一个值,则转到存储函数并在SELECT语句中使用函数调用
  3. 使用专用表格,您可以在其中推送感兴趣的值。喜欢(SessionID,paramId,paramValue)。在thios情况下,你的@param2是来自这个额外表格的SessionId