简体   繁体   English

SQL Server存储过程和用户​​查询之间的区别

[英]Differences between SQL Server stored procedure and user query

We have a stored procedure that pulls information from a few different tables to display some information. 我们有一个存储过程,该过程从几个不同的表中提取信息以显示一些信息。 This works fine. 这很好。

We now want to "borrow" some of the code and I'm trying to do some dev work. 现在,我们想“借用”一些代码,而我正在尝试做一些开发工作。 When I copy the contents of the stored procedure out into a query window and run it (minus the stored procedure related stuff), it completes successfully but no results are returned - in fact #test2 is not populated. 当我将存储过程的内容复制到查询窗口中并运行它时(减去与存储过程相关的内容),它成功完成但没有返回任何结果-实际上未填充#test2。 Running the same via the stored procedure returns results normally. 通过存储过程运行相同命令将正常返回结果。

Code is below from the query - stored procedure is the same just with ALTER PROCEDURE and I have changed all the table names etc... 下面的代码来自查询-存储过程与ALTER PROCEDURE相同,并且我更改了所有表名等。

    SET ANSI_NULLS ON
    GO

    SET QUOTED_IDENTIFIER ON
    GO

    DECLARE @reportstart smalldatetime, @reportend smalldatetime  

    SET @reportend = 2016-01-01
    SET @reportstart = 2016-02-01

    SET NOCOUNT ON;

    SELECT 
        OPA10.[PATIENT PATHWAY IDENTIFIER], OPA10.RTTPeriod  
    INTO #TEST
    FROM
        (SELECT
             PL.[PATIENT PATHWAY IDENTIFIER], PL.RTTPERIOD    
         FROM 
             [PATHWAY LTR] AS PL 
         INNER JOIN
             [PATHWAY LTR] AS PL2 ON PL.[PATIENT PATHWAY IDENTIFIER] = PL2.[PATIENT PATHWAY IDENTIFIER] 
                                  AND PL.LTRSequence = PL2.LTRSequence  +1
         INNER JOIN
             [PATIENT PATHWAY] AS PP ON PL.[PATIENT PATHWAY IDENTIFIER] = PP.[PATIENT PATHWAY IDENTIFIER] 
         WHERE
             PL.ActivityType = 'OPD'
             AND PL.LTRSequence = 3 
             AND (PL2.OPDisposal IN ('05', '08') 
              OR PL2.ActivityStatus IN ('DNA', 'CND'))) OPA10

    SELECT DISTINCT
        [PATIENT PATHWAY].[LOCAL PATIENT IDENTIFIER],
        [RTT PERIOD].[PATIENT PATHWAY IDENTIFIER], pd.Surname,
        [RTT PERIOD].[RTT PERIOD ID WITHIN PATHWAY], 
        CAST([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD START DATE] AS DATE) as 'RTT START DATE', 
        CAST([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] AS DATE) AS 'RTT END DATE', 
        [RTT PERIOD].[RTT SPECIALTY],
        CAST(DATEADD(D,126,[RTT PERIOD].[REFERRAL TO TREATMENT PERIOD START DATE])AS DATE) AS 'BREACH DATE',
        'BREACH FLAG' = CASE 
                           WHEN CAST(DATEADD(D, 126, [RTT PERIOD].[REFERRAL TO TREATMENT PERIOD START DATE]) AS DATE) < CAST([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] AS DATE)
                              THEN 'NOT WITHIN'
                              ELSE 'WITHIN'
                        END,
        --DATEDIFF(DD, CAST([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD START DATE] as date), 
        --CAST([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] AS date)) AS UNADJWAITDAYS,
        [RTT PERIOD].[RTT CLOCK STOP ACTIVITY], 
        [RTT PERIOD].[RTT CLOCK STOP ACTIVITY STATUS], 
        [RTT PERIOD].[RTT COMMISSIONER], [RTT PERIOD].[SHARED BREACH],
        [PATIENT PATHWAY SITE].[18WKSITE],
        [MERGE SPECIALTY].[DESCRIPTION],
        [MERGE SPECIALTY].[MERGE SPECIALTY],
        --,WLREMOVAL.Comment 
        --,[PATHWAY LTR].[InternalPatientNumber(iSOFT-PAS)]
        --,[PATHWAY LTR].[InternalEpisodeNumber(iSOFT-PAS)]
        --,[PATHWAY LTR].EpsActvDtime
        [PATHWAY LTR].LTRSequence,
        [PATIENT PATHWAY SITE].[18WK provider]
    INTO 
        #TEST2
    FROM         
        [RTT PERIOD] 

    /*  ************************
        THIS CODE HAS BEEN ADDED TO GET THE SITE FLAG
        ************************/
    INNER JOIN
        [PATIENT PATHWAY SITE] ON [RTT PERIOD].[PATIENT PATHWAY        IDENTIFIER] = [PATIENT PATHWAY SITE].[PATIENT PATHWAY IDENTIFIER]
    /****************************************/

    INNER JOIN
        [PATIENT PATHWAY] ON [RTT PERIOD].[PATIENT PATHWAY IDENTIFIER] = [PATIENT PATHWAY].[PATIENT PATHWAY IDENTIFIER]
    INNER JOIN 
        [PATHWAY LTR] ON [RTT PERIOD].[PATIENT PATHWAY IDENTIFIER] = [PATHWAY LTR].[PATIENT PATHWAY IDENTIFIER]
                      --and [RTT PERIOD].[RTT PERIOD ID WITHIN PATHWAY] = [PATHWAY LTR].RTTActivityID 
                      --and [PATHWAY LTR].RTTActivityID = 1
                      AND [PATHWAY LTR].EpsActvDtime = [RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE]
    --left outer join [iSOFT-PAS_Landing].dbo.WLREMOVAL on
       --[PATHWAY LTR].[InternalPatientNumber(iSOFT-PAS)] = WLREMOVAL.InternalPatientNumber
      --and [PATHWAY LTR].EpsActvDtime = WLREMOVAL.EpsActvDtimeInt
    INNER JOIN
        [iSOFT-PAS_Landing].dbo.PATDATA as PD ON [PATIENT PATHWAY].[InternalPatientNumber(iSOFT-PAS)] = PD.InternalPatientNumber
    LEFT OUTER JOIN
        [18-Weeks].dbo.[MERGE SPECIALTY] ON [MERGE SPECIALTY].[RTT SPECIALTY] = [RTT PERIOD].[RTT SPECIALTY]
    WHERE       
        ([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] >= @reportstart) 
        AND ([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] < @reportend ) 
        AND ([RTT PERIOD].[RTT PERIOD TYPE] = 'N') 
        AND ([RTT PERIOD].[REFERRAL TO TREATMENT STATUS AT END OF PERIOD]) <>'33' 
        AND ([RTT PERIOD].[RTT CLOCK STOP ACTIVITY]) <> 'opd' 
        AND ([PATHWAY LTR].[ActivityType]) <> 'WADD' 
        AND ([RTT PERIOD].[RTT PERIOD ID WITHIN PATHWAY]) =1
        --and [PATIENT PATHWAY SITE].[18WK provider]='RN700'
        OR ([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] >= @reportstart) 
        AND ([RTT PERIOD].[REFERRAL TO TREATMENT PERIOD END DATE] < @reportend) 
        AND ([RTT PERIOD].[RTT PERIOD TYPE] = 'N') 
        AND ([RTT PERIOD].[REFERRAL TO TREATMENT STATUS AT END OF PERIOD]) <>'33' 
        AND ([RTT PERIOD].[RTT CLOCK STOP ACTIVITY]) <> 'opd' 
        AND ([PATHWAY LTR].[ActivityType]) = 'book' 
        AND ([RTT PERIOD].[RTT PERIOD ID WITHIN PATHWAY]) = 2
        --and [PATIENT PATHWAY SITE].[18WK provider]='RN7

   SELECT t2.* 
   FROM #TEST2 AS T2
   LEFT OUTER JOIN #TEST AS T ON T2.[PATIENT PATHWAY IDENTIFIER] = T.[PATIENT PATHWAY IDENTIFIER]
                               AND T2.[RTT PERIOD ID WITHIN PATHWAY] = T.RTTPeriod
   WHERE
       t.[PATIENT PATHWAY IDENTIFIER] IS NULL


   select * from #TEST
   select * from #TEST2

        -- drop table #TEST2
        -- drop table #TEST

You need to quote date with ' : 您需要用'引用日期:

DECLARE @reportstart smalldatetime, @reportend smalldatetime;                 

SET @reportend = '2016-01-01';
SET @reportstart = '2016-02-01';

Otherwise you will get implicit conversion from INT to DATE which is year 1905. 否则,您将隐式地从INT转换为DATE ,即1905年。

LiveDemo


It works similiar to this: 它的工作与此类似:

SET @reportend = 2016-01-01;
--SET @reportend = 2014   -- int
--SET @reportend = DATEADD(d, 2014,'1900-01-01')
--SET @reportend = '1905-07-08 00:00:00'

I highly doubt that you have data from 1905 😎 我非常怀疑您有1905以来的数据😎

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM