2

2つのパラメーターを受け取るSQLサーバー上のストアドプロシージャがあります。selectによって返されるすべての行に対してstpを実行したいと思います。

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

@param2このstpを実行して、selectステートメントによって返されるパラメーターのリストを渡したいと思います。

何かのようなもの :

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

何か案が ?

4

2 に答える 2

3

私がこの質問を正しく読んでいる場合(私はそうではないかもしれません):::

これは、カーソルが可能な解決策の1つです。 しかし、カーソルは通常ひどい解決策です。

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. 関心のある値をプッシュできる専用のテーブルを使用してください。Like(SessionID、paramId、paramValue)。この場合、@param2はこの追加のテーブルのSessionIdです。
于 2013-03-06T15:06:59.983 に答える