2

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

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

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

就像是 :

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

任何想法 ?

4

2 回答 2

3

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

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

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

但我建议阅读“基于集合”与“通过痛苦行来行”的哲学。如果您有兴趣,请留言。

于 2013-03-06T14:56:02.307 回答
1

我建议如下:

  1. 如果您的参数列表相当简单,则使用字符串作为@param2。像'|1|2|100500|'。然后使用过程拆分字符串并使用这些参数
  2. 如果您的程序返回一个值,则使用存储函数并在 SELECT 语句中使用函数调用
  3. 使用专用表,您可以在其中推送感兴趣的值。像(SessionID,paramId,paramValue)。在 thios 情况下,您的 @param2 是这个额外表中的 SessionId
于 2013-03-06T15:06:59.983 回答