我需要的工作流程如下: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表。
工作流程如上怎样实现比较优化呢?
所花的时间:和在一起一次加载的时间比分两次加载要长得多。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表。
工作流程如上怎样实现比较优化呢?
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.