我需要的工作流程如下:1.对DeviceInfo表做了以下存储过程,使用时在C#中我需要执行两次,第一次@IsDevice=false,@IsPart不定;第二次加载@IsDevice=true,@IsPart为前次的值。分两次主要是因为当我在Where子句中如把条件用OR放在一起如:WHERE ((DistrictID = @DistrictID)  AND  (DeviceTypeID = 1)) or(DeviceTypeID =4 and DeviceID IN (SELECT GroupID FROM DeviceInfo WHERE (DistrictID = @DistrictID)  AND (DeviceTypeID = 1)GROUP BY GroupID))
所花的时间:和在一起一次加载的时间比分两次加载要长得多。10秒 VS 2秒
create table DeviceInfo(
DeviceID nvarchar(20) , 
DistrictID nvarchar(20), 
NewNotesTime smalldatetime, 
GroupID nvarchar(20),
DeviceTypeID int)
USE [QianFeng]
GO
/****** Object:  StoredProcedure [dbo].[GetDeviceInfo]    Script Date: 08/28/2009 19:20:05 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER procedure [dbo].[GetDeviceInfo]
 @IsPart bit,
 @DistrictID nvarchar(20),
 @IsDevice bit
as
if(@IsDevice >0)
begin 
if(@IsPart>0)
begin
SELECT  DeviceID, DistrictID, NewNotesTime, GroupID,DeviceTypeID
FROM DeviceInfo
WHERE (DistrictID = @DistrictID) AND (DATEDIFF(month, NewNotesTime, GETDATE()) > 0) AND 
      (DeviceTypeID = 1)
end
else
begin
SELECT DeviceID, DistrictID, NewNotesTime, GroupID,DeviceTypeID
FROM DeviceInfo
WHERE (DistrictID = @DistrictID)  AND 
      (DeviceTypeID = 1)
end
end
else
begin
if(@IsPart>0)
begin
SELECT  DeviceID, DistrictID, NewNotesTime, GroupID,DeviceTypeID
FROM DeviceInfo
WHERE (DeviceTypeID =4 and DeviceID IN
          (SELECT GroupID
FROM DeviceInfo
WHERE (DistrictID = @DistrictID) AND (DATEDIFF(month, NewNotesTime, GETDATE()) > 0) AND 
      (DeviceTypeID = 1)
GROUP BY GroupID))
end
else
begin
SELECT DeviceID, DistrictID, NewNotesTime, GroupID,DeviceTypeID
FROM DeviceInfo
WHERE (DeviceTypeID =4 and DeviceID IN
          (SELECT GroupID
FROM DeviceInfo
WHERE (DistrictID = @DistrictID)  AND 
      (DeviceTypeID = 1)
GROUP BY GroupID))
end
end2.我还需要根据前面DeviceInfo表加载的结果,再次加载另一个QFInstall表create table QFInstall(
DeviceID nvarchar(20) ,
UpQFID int )
通过前面DeviceInfo表(@IsDevice=false与true两次)加载结果的DeviceID字段加载对应的QFInstall表。
工作流程如上怎样实现比较优化呢?

解决方案 »

  1.   

    存储过程就是根据参数执行不同的SQL语句,这个很简单的
      

  2.   

    看看这个吧,有进参,有出参.D. 使用 OUTPUT 参数
    OUTPUT 参数允许外部过程、批处理或多条 Transact-SQL 语句访问在过程执行期间设置的某个值。下面的示例创建一个存储过程 (titles_sum),并使用一个可选的输入参数和一个输出参数。首先,创建过程:USE pubs
    GO
    IF EXISTS(SELECT name FROM sysobjects
          WHERE name = 'titles_sum' AND type = 'P')
       DROP PROCEDURE titles_sum
    GO
    USE pubs
    GO
    CREATE PROCEDURE titles_sum @@TITLE varchar(40) = '%', @@SUM money OUTPUT
    AS
    SELECT 'Title Name' = title
    FROM titles 
    WHERE title LIKE @@TITLE 
    SELECT @@SUM = SUM(price)
    FROM titles
    WHERE title LIKE @@TITLE
    GO接下来,将该 OUTPUT 参数用于控制流语言。 说明  OUTPUT 变量必须在创建表和使用该变量时都进行定义。
    参数名和变量名不一定要匹配,不过数据类型和参数位置必须匹配(除非使用 @@SUM = variable 形式)。 DECLARE @@TOTALCOST money
    EXECUTE titles_sum 'The%', @@TOTALCOST OUTPUT
    IF @@TOTALCOST < 200 
    BEGIN
       PRINT ' '
       PRINT 'All of these titles can be purchased for less than $200.'
    END
    ELSE
       SELECT 'The total cost of these titles is $' 
             + RTRIM(CAST(@@TOTALCOST AS varchar(20)))下面是结果集:Title Name                                                               
    ------------------------------------------------------------------------ 
    The Busy Executive's Database Guide
    The Gourmet Microwave
    The Psychology of Computer Cooking(3 row(s) affected)Warning, null value eliminated from aggregate.
     
    All of these titles can be purchased for less than $200.