Использование временной таблицы в SQL SP — не возвращает значения

#sql #sql-server #sql-server-2008 #stored-procedures

#sql #sql-server #sql-server-2008 #хранимые процедуры

Вопрос:

мне, ребята, снова нужна ваша помощь, прежде чем я сойду с ума…

Теперь у меня есть следующий SP, если я выполняю его в SP, он работает нормально, но как только я выполняю sp, я не получаю результатов….

 ALTER PROCEDURE [dbo].[BIDASHBOARD_MiningUtilization] 

 @DST datetime, @DET datetime, @Equipment int

AS
BEGIN

--DECLARE @DST datetime, @DET datetime, @Equipment int
--SET @DET = @DET
--SET @DET = '2014-02-01 00:00:00.000'
--SET @DST = DATEADD(dd,1,@DST)
--SET @DST = '2014-02-28 00:00:00.000'
--SET @Equipment = 8


DROP TABLE #TMP1
CREATE TABLE #TMP1 (DownTime int, DType varchar(50));
INSERT INTO #TMP1

SELECT SUM(UTILSUM.[Minutes])/ 60 AS DOWNTIME, UTILSUM.DTYPE

FROM

(SELECT TOTAL.EquipmentID, TOTAL.DownTimeReasonCategoryID, TOTAL.ReasonNote,TOTAL.SDATE,TOTAL.EDATE, DATEDIFF(Mi,TOTAL.SDATE,TOTAL.EDATE) AS [Minutes],TOTAL.DTYPE
FROM

(SELECT 
      [EquipmentID]
      ,[DownStartTime]
      ,[DownEndTime]
      ,[DownTimeReasonCategoryID]
      ,[ReasonNote]

      ,SDATE = 
      CASE 
      WHEN [DownStartTime] BETWEEN @DET AND @DST THEN [DownStartTime]
        ELSE @DET
        END
        ,EDATE =
        CASE 
      WHEN [DownEndTime] BETWEEN @DET AND @DST THEN [DownEndTime]
        ELSE @DST 
        END
        , DTYPE =
        CASE
        WHEN [DownTimeReasonCategoryID] IN (2,5,7,9,11)  THEN 'Equipment Unavailable'
        WHEN [DownTimeReasonCategoryID] IN (1,3,8,12,13)  THEN'Equipment Not Utilized'
        ELSE 'CAT6'
        END

  FROM RPZCBIDashboard].[dbo].[Mining_DOWNTIMETEST]
 Where DownStartTime < @DST 
AND DownEndTime >= @DET
  and EquipmentID in (SELECT[EquipmentId]

  FROM RPZCBIDashboard].[dbo].[Mining_Equipment]
  Where EquipmentTypeId = @Equipment
  and IsActive = 1
 and EquipmentDownTime = 1)) AS TOTAL) AS UTILSUM
 GROUP BY UTILSUM.DTYPE

  SELECT  #TMP1.DownTime, #TMP1.DType  FROM #TMP1 WHERE #TMP1.DType  <> 'CAT6'

  UNION ALL

 SELECT DATEDIFF(HH,@DET,@DST) * (SELECT COUNT([EquipmentId])
 FROM RPZCBIDashboard].[dbo].[Mining_Equipment]
 Where EquipmentTypeId = @Equipment 
 and IsActive = 1)-(SELECT SUM(#TMP1.DownTime) FROM #TMP1 WHERE #TMP1.DType  <> 'CAT6' ), 'Productive Time'


 SELECT @DST
 SELECT @DET 

 SELECT @Equipment 
  

Это мой SP, если я удалю часть комментария, в которой я устанавливаю переменную и запускаю ее, удаляя объявление параметров вверху, она возвращает результаты без проблем.

Но если я выполню код следующим образом:

 DECLARE @return_value int

EXEC    @return_value = [dbo].[BIDASHBOARD_MiningUtilization]
        @DST = '2014-02-01 00:00:00.000',
        @DET = '2014-02-28 00:00:00.000',
        @Equipment = 8

SELECT  'Return Value' = @return_value

GO
  

Я получаю только это…

 DownTime    DType
NULL    Productive Time
  

и это сообщение..
Сообщение 3701, уровень 11, состояние 5, процедура BIDASHBOARD_MiningUtilization, строка 21
Невозможно удалить таблицу ‘#TMP1’, потому что она не существует или у вас нет разрешения.

Это результаты, которые я получаю, когда запускаю запрос в процедуре хранения:

 DownTime    DType
23          Equipment Not Utilized
1130    Equipment Unavailable
7919    Productive Time
  

Комментарии:

1. Кажется, вам не хватает некоторых [ символов при обращении RPZCBIDashboard] .

Ответ №1:

в вашем SP попробуйте заменить это

 DROP TABLE #TMP1
  

с помощью этого

 IF OBJECT_ID('tempdb..#TMP1') IS NOT NULL DROP TABLE #TMP1
  

Комментарии:

1. Привет, G2server, на самом деле это не вызывает моего разочарования, потому что, если я запускаю SP в этом окне, я получаю результаты, но как только я выполняю sp извне, он не возвращает значения, но спасибо за фрагмент кода.

2. Можете ли вы попробовать создать тот же SP (заменить ALTER на CREATE) и изменить имя на eg. [BIDASHBOARD_MiningUtilization2] ?, затем попробуйте ВЫПОЛНИТЬ новый SP на той же вкладке SSMS?

3. Это означает, что я должен установить параметры на вкладке SSMS для обеих процедур?

4. прошу прощения, я предположил, что для СОЗДАНИЯ временной таблицы могли потребоваться разрешения… на самом деле их нет. (я предположил, что у человека, который создал SP, были более ограничительные разрешения, чем у вас).

Ответ №2:

Я решил проблему:

 EXEC    @return_value = [dbo].[BIDASHBOARD_MiningUtilization]
        @DET = '2014-02-01 00:00:00.000',
        @DST = '2014-02-28 00:00:00.000',
        @Equipment = 8
  

Неверные диапазоны дат.

Комментарии:

1. Я бы подумал, что время начала наступит раньше времени окончания, но рад, что вы его отсортировали! 🙂

Ответ №3:

сделайте drop table if exist , как показано ниже, вместо того, чтобы напрямую удалять его

 if exists (select * from sys.objects where name = '#TMP1')
    drop table #TMP1
  

В вашей процедуре много ошибок, как указано ниже

 ALTER PROCEDURE [dbo].[BIDASHBOARD_MiningUtilization] 

 @DST datetime, @DET datetime, @Equipment int

AS
BEGIN

DROP TABLE #TMP1  <-- change it as sigested in answer
CREATE TABLE #TMP1 (DownTime int, DType varchar(50));
INSERT INTO #TMP1

SELECT SUM(UTILSUM.[Minutes])/ 60 AS DOWNTIME, UTILSUM.DTYPE

FROM

(SELECT DATEDIFF(Mi,TOTAL.SDATE,TOTAL.EDATE) AS [Minutes],TOTAL.DTYPE <-- 2, no need of feching extra columns 
FROM

(SELECT 
      [EquipmentID]
      ,[DownStartTime]
      ,[DownEndTime]
      ,[DownTimeReasonCategoryID]
      ,[ReasonNote]

      ,SDATE = 
      CASE 
      WHEN [DownStartTime] BETWEEN @DET AND @DST THEN [DownStartTime]
        ELSE @DET
        END
        ,EDATE =
        CASE 
      WHEN [DownEndTime] BETWEEN @DET AND @DST THEN [DownEndTime]
        ELSE @DST 
        END
        , DTYPE =
        CASE
        WHEN [DownTimeReasonCategoryID] IN (2,5,7,9,11)  THEN 'Equipment Unavailable'
        WHEN [DownTimeReasonCategoryID] IN (1,3,8,12,13)  THEN'Equipment Not Utilized'
        ELSE 'CAT6'
        END

  FROM [RPZCBIDashboard].[dbo].[Mining_DOWNTIMETEST] <-- 3, missing '['
 Where DownStartTime < @DST 
AND DownEndTime >= @DET
  and EquipmentID in (SELECT [EquipmentId] <-- 4, missing a space after select

  FROM [RPZCBIDashboard].[dbo].[Mining_Equipment] <-- 5, missing '['
  Where EquipmentTypeId = @Equipment
  and IsActive = 1
 and EquipmentDownTime = 1)) AS TOTAL) AS UTILSUM
 GROUP BY UTILSUM.DTYPE

  SELECT  #TMP1.DownTime, #TMP1.DType  FROM #TMP1 WHERE #TMP1.DType  <> 'CAT6'

  UNION ALL

 SELECT DATEDIFF(HH,@DET,@DST) * (SELECT COUNT([EquipmentId])  <-- 6, remove SELECT from SELECT COUNT([EquipmentId]
 FROM RPZCBIDashboard].[dbo].[Mining_Equipment]
 Where EquipmentTypeId = @Equipment 
 and IsActive = 1)-(SELECT SUM(#TMP1.DownTime) FROM #TMP1 WHERE #TMP1.DType  <> 'CAT6' ), 'Productive Time'
  

Комментарии:

1. Привет, Рахул, спасибо за код, но это не моя проблема, у меня есть 🙂