0

stackoverflow で検索機能を使用していますが、問題の答えが見つかりません。しかし、私がこの問題の最初の人になることはできないと確信しています.

私の SQL Server 2012 では、行を挿入していますが、挿入後のトリガーがあります。挿入された疑似テーブルには、特にタイムスタンプを持つ 1 つの行が含まれます。

私の関数では、タイムスタンプは、1 時間ごとに 1 行から x 行のデータセットを生成します。クロス結合では、ターゲット テーブルに挿入しようとしている複数行のデータセットがあります。

心に留めておくべきこと:
ソース テーブルに 1 つの行を挿入すると、トリガーが起動されます。挿入されたテーブルには 1 行が含まれます。ターゲット テーブルに複数の行を挿入しようとしています。

エラーメッセージ:

サブクエリが複数の値を返しました。サブクエリが =、!=、<、<=、>、>= の後にある場合、またはサブクエリが式として使用されている場合、これは許可されません。

コード

  -- Insert statements for trigger here
DECLARE @state_time DATETIME,@end_time DATETIME
SET @state_time =
    (SELECT state_time from inserted)
SET @end_time =
    (SELECT end_time from inserted)

BEGIN TRY

       INSERT INTO t_Duration
          SELECT
    i.interval
    ,t1.call_id
    ,t1.agent_id
    ,t1.service_id
    ,t1.state
    ,i.duration
         FROM
             (SELECT * 
              FROM myFUnction(@state_time, @end_time, 15)) AS i -- here i get more than one row
         CROSS JOIN 
             (SELECT * from inserted) AS t1
END TRY
BEGIN CATCH
END CATCH

なんで?トリガーで複数の行を挿入することはできませんか? をコピーしINSERT INTOて、テーブル変数を使用して挿入されたテーブルを偽造すると、挿入が正常に実行されます。

しばらく検索すると、カーソルが必要なようです。これは正しいですか。代替手段はありますか?

手がかりはありますか?

ありがとうフランク

===編集

私が何をしているのかを説明する必要があります...状態、「接続」、call_id、開始タイムスタンプ、および終了タイムスタンプを含むcallrecordsを取得します。期間を報告する必要があります。私は3つのパラメータstart、end、および間隔の持続時間を分単位で持つテーブル値関数を書きました。

結果セットとして、間隔ごとに 1 行のデータセットを取得します。interval_is (1970 年以降の間隔ごとに一意の ID を作成します) と、通話が間隔と重複する場合の期間が含まれています。

ソース テーブルの挿入セット データセット:

---------------------------------------------------------------
| call_id | state | starttime           | endtime             |
---------------------------------------------------------------
| 4711    | 4     | 2013-10-31 09:25:12 | 2013-10-31 09:32:24 |
---------------------------------------------------------------

関数の結果は次のとおりです。

--------------------------
| interval_id | duration |
--------------------------
| 3991333     | 288      |
--------------------------
| 3991334     | 144      |
--------------------------

クロス結合を使用して、ターゲット テーブルに挿入しようとします。

---------------------------------------------
| interval_id | state | call_id | duration  |
---------------------------------------------
| 3991333     | 4     | 4711    | 288       |
---------------------------------------------
| 3991334     | 4     | 4711    | 144       |
---------------------------------------------

そしてそれは失敗します。

4

1 に答える 1

0

私はすでに自分の質問に答えるのが苦手です。多くの有益なコメントを受け取り、正しい道を歩むことができました。

この問題について私に手紙を書いてくれたすべての人に、少しお詫び申し上げます。

問題は vraibeles の設定であり、挿入ではありませんでした....

そこで、次のコードでクロス結合を変更します。

    INSERT INTO t_Duration
    SELECT 
        t.interval
        ,t.call_id
        ,t.agent_id
        ,t.service_id
        ,t.state
        ,t.duration
    FROM (
        SELECT 
            *
        FROM
            inserted AS i
        CROSS APPLY (
        SELECT 
            *
        FROM 
            fInterval2(i.state_time,i.end_time,15) AS iid
        ) AS ext
    ) AS t

それは完璧に機能します。ありがとうフランク

于 2013-10-31T19:23:46.693 に答える