10

このクエリからテーブル値関数を作成するにはどうすればよいですか?

HH:MM仕事の開始時間と終了時間の間の 結果として時間を計算する必要があります

このクエリは、SQL で実行すると機能します。

DECLARE @USERID int;
SET @USERID = 10

DECLARE @JOBStartDATE DATETIME;
SET @JOBStartDATE = (SELECT StartJOBHoursDATE FROM JOBs WHERE ID=@USERID) 


DECLARE @StartTime DATETIME;
DECLARE @JOBDateTime DATETIME;
DECLARE @JOBEvent nvarchar(50);
DECLARE @totalTime int;
SET @totalTime = 0;

SELECT  ROW_NUMBER() OVER(ORDER BY JOBID) AS ROWNUM, JOBDateTime,JOBEvent  INTO #TEMP FROM  JOBsActivityData where JOBID = @USERID and JOBDateTime >= @JOBStartDATE
DECLARE @MaxRownum INT
SET @MaxRownum = (SELECT MAX(RowNum) FROM #TEMP)
DECLARE @Iter INT
SET @Iter = (SELECT MIN(RowNum) FROM #TEMP)

WHILE @Iter <= @MaxRownum
BEGIN
SET @JOBDateTime =(SELECT JOBDateTime FROM #TEMP WHERE RowNum = @Iter)
SET @JOBEvent =(SELECT JOBEvent FROM #TEMP WHERE RowNum = @Iter)
IF(@JOBEvent = 'START')
BEGIN
SET @StartTime =(SELECT JOBDateTime FROM #TEMP WHERE RowNum = @Iter)
END
IF(@JOBEvent = 'END' AND @StartTime IS NOT NULL)
BEGIN
SET @totalTime = @totalTime + (SELECT DATEDIFF(minute,@StartTime,@JOBDateTime))
SET @StartTime = NULL;
END

    SET @Iter = @Iter + 1
END

DROP TABLE #TEMP

SELECT CAST((@totalTime / 60) AS VARCHAR(8)) + ':' + 
       CAST((@totalTime % 60) AS VARCHAR(2)) AS JOBHours

作成しようとすると、このエラーが発生します

関数内から一時テーブルにアクセスできません。

4

2 に答える 2

17

サーバーは、関数内のテーブルの変更を許可しません。代わりにテーブル変数を使用してください。

declare @temp table (RowNum int, JOBDateTime DateTime, JOBEvent int)

insert into @temp
  SELECT ROW_NUMBER() OVER(ORDER BY JOBID) AS ROWNUM, 
         JOBDateTime,
         JOBEvent  
    FROM JOBsActivityData 
   where JOBID = @USERID and JOBDateTime >= @JOBStartDATE
...

テーブル変数を使用する場合、それらを削除する必要はありません。

于 2013-01-27T07:42:49.370 に答える
4

Tempテーブルを使用する代わりに、テーブル変数を使用してください。これで問題が解決します。この同様の質問を参照してください関数内から一時テーブルにアクセスできません

于 2013-01-27T07:41:39.210 に答える