1

Inline table functionSQL Server 2008 R2 でを作成しましたが、一部のクエリが任意のレコードを返すことに気付きました。だから私はそれが起こったときに、すべての空の列を持つレコードを返すことを望みます.

例:

Col1   Col2   Col3
NULL   NULL   NULL

更新:ここに関数があります

ALTER FUNCTION [dbo].[GetWorksheetSummaryByObjective](@objectiveId [smallint], @testTemplateId [smallint])
RETURNS @resultTable TABLE (
    [AnsweredWorksheetId] [smallint] NOT NULL,
    [LastDate] [date] NULL,
    [BestScore] [smallint] NULL,
    [ShouldBeMakeUp] [tinyint] NOT NULL
)
AS 
BEGIN

    INSERT @resultTable
    SELECT TOP 1 B.Id AS AnsweredWorksheetId, A.Date, CONVERT(smallint, B.Score * 100),
        CASE
        WHEN B.Score >= 0.7 THEN 0
        ELSE 1
        END AS ShouldBeMakeUp
    FROM AnsweredTest AS A
    RIGHT JOIN AnsweredWorksheet AS B ON (A.Id = B.AnsweredTestId)
    WHERE B.ObjectiveId = @objectiveId AND A.ExamTemplateId = @testTemplateId
    ORDER BY B.Score DESC

    RETURN
END
4

3 に答える 3

1

あなたが投稿した関数はインラインTVFではありません。

基になるクエリが最大で1行を返すことを考えると、またはなしでTOP 1SELECT MAX()またはGROUP BY常にHAVING単一の行を返すため、インラインTVFとしてこれを行うことができますが、以下のようになります。

CREATE FUNCTION [dbo].[Getworksheetsummarybyobjective](@objectiveId    [SMALLINT],
                                                       @testTemplateId [SMALLINT])
RETURNS TABLE
AS
    RETURN
      (SELECT Max(AnsweredWorksheetId) AS AnsweredWorksheetId,
              Max([LastDate])          AS [LastDate],
              Max([BestScore])         AS [BestScore],
              Max(ShouldBeMakeUp)      AS ShouldBeMakeUp
       FROM   (SELECT TOP 1 B.Id                             AS AnsweredWorksheetId,
                            A.Date                           AS [LastDate],
                            CONVERT(SMALLINT, B.Score * 100) AS [BestScore],
                            CASE
                              WHEN B.Score >= 0.7 THEN 0
                              ELSE 1
                            END                              AS ShouldBeMakeUp
               FROM   AnsweredTest AS A
                      RIGHT JOIN AnsweredWorksheet AS B
                        ON ( A.Id = B.AnsweredTestId )
               WHERE  B.ObjectiveId = @objectiveId
                      AND A.ExamTemplateId = @testTemplateId
               ORDER  BY B.Score DESC) T) 
于 2012-10-27T19:59:04.093 に答える
0

このようなものは機能しますか?

declare @tbl table
(
  Col1 int, Col2 int, Col3 int
)

insert @tbl (Col1, Col2, Col3)
     select Col1, Col2, Col3 from SomeTable where blah = blah

if exists (select 1 from @tbl)
begin
    select Col1, Col2, Col3 from @tbl
end
else
begin
    select null Col1, null Col2, null Col3
end
于 2012-10-27T19:21:44.320 に答える
0

わかりました、私の他の答えをスキップしてください-テーブル関数がどれほど制限的であるかに気づきませんでした。別の考えがあります-これは機能するはずですが、関数でWHEREを2回実行する必要があるため、呼び出しを行うにはリソースを2倍にします:

CREATE FUNCTION dbo.SomeTest
    ( @i int ) 
RETURNS TABLE
as
RETURN 
    select Col1, Col2 from SomeTable
    where Whatever = Whatever

    union all

    select null Col1, null Col2
    where not exists (select 1 from SomeTable where Whatever = Whatever)
go

編集:二重浸漬せずにこれを行う別の方法を考えました:

create function dbo.SomeTest
    ( @i int )
returns table
as
return
select t.Col1, t.Col2 from 
(
    select Col1, Col2
    from SomeTable
    where Whatever = Whatever
) t
right join
(
    select 1 testcol
) x on c.Col1 is not null
go

これは、Col1 が null 以外の列であることを前提としています。

于 2012-10-27T19:50:55.727 に答える