Sql server 如果sql server中存在fdate和tdate之间的load seprate表,请检查fdate和tdate之间的日期

Sql server 如果sql server中存在fdate和tdate之间的load seprate表,请检查fdate和tdate之间的日期,sql-server,sql-server-2008,sql-server-2012,Sql Server,Sql Server 2008,Sql Server 2012,嗨,朋友们,我对sql server有点怀疑,请告诉我如何解决 桌子: 病人: pid |日期|名称 100 | 2015-01-01 | Abc 101 | 2015-02-20 |巴努 102 | 2015-03-14 |哈里 ` 基于上表,我想在地址表中检查from date和todate之间的患者日期。 如果记录的addtress中的患者日期介于fromdate和todate之间,我希望加载单独的临时表 在tempresult表中,我只需要患者的姓名列,对于记录的标识,请添加一个 列状态

嗨,朋友们,我对sql server有点怀疑,请告诉我如何解决 桌子: 病人: pid |日期|名称 100 | 2015-01-01 | Abc 101 | 2015-02-20 |巴努 102 | 2015-03-14 |哈里

`

基于上表,我想在地址表中检查from date和todate之间的患者日期。 如果记录的addtress中的患者日期介于fromdate和todate之间,我希望加载单独的临时表 在tempresult表中,我只需要患者的姓名列,对于记录的标识,请添加一个 列状态。 f记录的addtress中的患者日期不在fromdate和todate之间我希望加载相同的temparay表 在结果表中。 最终临时表结果如下所示:

Tablesname :##TempResult

Name |  Status
Abc  | Outdate
banu | Indate
hari | outdate
我试着像下面一样 它给出了正确的值,但就性能而言,这不是一个好方法 到期记录检查2次到期记录请告诉我其他方式 解决这个问题。 我试过的另一种方式

alter procedure [dbo].[FindDate]
as
begin
 IF OBJECT_ID('tempdb..##Address') IS NOT NULL
drop table ##Address
create table ##Address
(
id int identity(1,1),
patientnumber int,
fromdate date,
Todate date,
Address varchar(50)
)
IF OBJECT_ID('tempdb..##Result') IS NOT NULL
drop table ##Result
create table ##Result
(
Name varchar(50),
Filter varchar(10)
)

insert into ##Address 
select patientnumber,fromdate,todate,address from Address
----------------------------------------------------

declare @acount int
select @acount=count(id) from ##Address


declare @i int
set @i=1

while @i<=@acount
begin

declare @pn int,@fromdate date,@todate date,@address varchar(50)

select @pn=patientnumber,@fromdate=fromdate,@todate=Todate from ##Address 
where id=@i
set @i=@i+1
end

declare @bcount int
declare @in int
set @in=1

while @i<=@bcount
begin
select @bcount=count(1) from patient

where patientnumber=@pn and [patient].[date] between @fromdate and @todate

if @bcount<>0

begin
insert into ##Result
select name,'InDate' as Filter from patient
where patientnumber=@pn
end
 else
print '4'
begin
insert into ##Result
select name,'OutDate' as Filter from patient
where patientnumber=@pn
end

---set @i=@i+1;
select * from ##Result
end
end
这一个没有给出很好的结果,它需要更多的时间来记录3条记录。
请告诉我如何在sql server中解决此问题。

此方法的许多方面都会引起我的疑问,但为了简洁起见,我将仅展示一些小的改进,以帮助您继续

首先,示例地址表缺少一个PK,这通常是一个坏主意,当行数增加时,可能会影响性能。在这个特定的示例中,它并没有真正改变任何事情,但留下这样的差距可能会在以后伤害到您。或者你只是把它留作样本,我不知道。无论如何,这将解决问题:

ALTER TABLE [dbo].[Address] ADD [aid] INT IDENTITY(1,1) PRIMARY KEY NOT NULL; 
无论PK如何,您当前的计划如下所示: 而且也不漂亮。对于一些相当简单的事情,它包括许多操作,当数据量增加时,性能可能真的很糟糕。除了看大局和更改数据模型等之外,还有一个简单的步骤可以通过如下更改过程来帮助您:

IF OBJECT_ID(N'[dbo].[test]', 'P') IS NOT NULL
    BEGIN
        DROP PROCEDURE [dbo].[test];
    END;
GO 
CREATE PROCEDURE [test]
AS
    BEGIN
        IF OBJECT_ID('tempdb..##Result') IS NOT NULL
            DROP
TABLE [##Result];
        CREATE
TABLE [##Result]
            (
              [Name] VARCHAR(50) ,
              [Filter] VARCHAR(10)
            );

        INSERT  INTO [##Result]
                SELECT  [a].[Name] ,
                        CASE WHEN [a].[Date] <= [b].[Fromdate]
                                  AND [a].[Date] >= [b].[ToDate] THEN 'InDate'
                             WHEN [a].[Date] <> [b].[Fromdate]
                                  AND [a].[Date] <> [b].[ToDate] THEN 'outDate'
                        END AS [Filter]
                FROM    [dbo].[patient] [a]
                        JOIN [dbo].[Address] [b] ON [a].[pid] = [b].[Pid];

        SELECT  *
        FROM    [##Result];
    END;
这就产生了以下计划: 正如您所看到的,这少了很多步骤,应该可以在一定程度上提高性能

ALTER TABLE [dbo].[Address] ADD [aid] INT IDENTITY(1,1) PRIMARY KEY NOT NULL; 
IF OBJECT_ID(N'[dbo].[test]', 'P') IS NOT NULL
    BEGIN
        DROP PROCEDURE [dbo].[test];
    END;
GO 
CREATE PROCEDURE [test]
AS
    BEGIN
        IF OBJECT_ID('tempdb..##Result') IS NOT NULL
            DROP
TABLE [##Result];
        CREATE
TABLE [##Result]
            (
              [Name] VARCHAR(50) ,
              [Filter] VARCHAR(10)
            );

        INSERT  INTO [##Result]
                SELECT  [a].[Name] ,
                        CASE WHEN [a].[Date] <= [b].[Fromdate]
                                  AND [a].[Date] >= [b].[ToDate] THEN 'InDate'
                             WHEN [a].[Date] <> [b].[Fromdate]
                                  AND [a].[Date] <> [b].[ToDate] THEN 'outDate'
                        END AS [Filter]
                FROM    [dbo].[patient] [a]
                        JOIN [dbo].[Address] [b] ON [a].[pid] = [b].[Pid];

        SELECT  *
        FROM    [##Result];
    END;