2

約1000列のテーブルから約15列のテーブルにデータを入力しています。大きなテーブルから時間をとる必要があります。その時間は分と時間[rn-min]と[rn-hr]に分割され、新しいテーブルでam/pm形式で必要になります。テーブルは外部の会社によって作成されているので、私はそれについてあまり変更することはできません。私はそれらを転送された列に入れて確認しました。それは大きくて遅いです、そして私はほんの数列を必要とします、そしてたくさんの重複した/類似した行があります。いずれにせよ、私は大きなテーブルから小さなテーブルを作っています。私はカーソルを書きましたが、その速度は遅く、それを行うためのより良い方法があるかどうか疑問に思いました。時刻と日付の保存方法を変更したいので、単純な挿入(列の選択)を使用することはできません。ありがとう、どんな助けやアドバイスも大歓迎です

declare data CURSOR READ_ONLY FORWARD_ONLY
for   
    select [raID],
            (otherfields),
            CAST([RA-rent-mm] as varchar(2)) + '/' + CAST([RA-rent-dd] as varchar(2)) + '/' +
            CAST([RA-Rent-CC] as varchar(2)) + CAST([RA-RENT-YY] as varchar(2)) [Date_Out],
            CAST([RA-Rtrn-mm] as varchar(2)) + '/' + CAST([RA-Rtrn-dd] as varchar(2)) +
            '/' + CAST([RA-Rtrn-CC] as varchar(2)) + CAST([RA-Rtrn-YY] as varchar(2)) [Date_In],
            CAST([RA-RENTAL-HOURS] as varchar(2)),
            CAST([RA-RENTAL-Minutes] as varchar(2)),
            CAST([RA-RTRN-HOURS] as varchar(2)),
            CAST([RA-RTRN-MINUTES] as varchar(2)),
            (other fields)
      from table_name
     where Transfered is null
       and [RA-rtrn-mm] != 0 --this keeps me from getting the duplicate/similar rows, once this doesn't equal 0 there aren't anymore rows so I just grab this one

declare @sql as varchar(max)
declare @raID int;
    (other fields),
declare @rentDate varchar(8);
declare @rtrnDate varchar(8);
declare @rentHours varchar(2);
declare @rentMinutes varchar(2);
declare @rtrnHours varchar(2);
declare @rtrnMinutes varchar(2);
    (other fields)

open data
    fetch next from data into 
        @raID,
        (other fields),
        @rentDate ,
        @rtrnDate ,
        @rentHours ,
        @rentMinutes ,
        @rtrnHours ,
        @rtrnMinutes ,
        (other fields),
    while @@FETCH_STATUS = 0
    begin
        set @rentMinutes = left('0' + @rentMinutes,2);--padding with 0 if minutes is 1-9
        set @rtrnMinutes = left('0' + @rtrnMinutes,2);

        --turning the varchar times into a time then back to varchar with correct am/pm notation
        declare @rentT time = @rentHours + ':' + @rentMinutes;
        declare @rtnT time = @rtrnHours + ':' + @rtrnMinutes;
        declare @rentTime varchar(7) = convert(varchar(15),@rentT, 100);
        declare @returnTime varchar(7) = convert(varchar(15),@rtnT, 100);

        --print @rentTime;
        set @sql = 'INSERT other_tbl_name(raID, (other fields), Date_Out, Date_In, Time_Out, Time_In,    (other fields))
                values ('+cast(@raID as varchar(max))+', (other fields),'''+@rentDate+''',
                            '''+@rtrnDate+''', '''+@rentTime+''', '''+@returnTime+''',
                            (other fields))';

        --exec(@sql)
        print @sql

        --need a way to make sure the insert worked before updating
        --need to update transferred to keep from updating the same info

        declare @update as varchar(max) = '
        UPDATE Capture.icokc_data
           SET Transfered = 1
         WHERE [raID] = '+cast(@raID as varchar(10))

        --exec(@update)
        --print @update

        fetch next from data into 
            @raID,
            (other fields)
            @rentDate ,
            @rtrnDate ,
            @rentHours ,
            @rentMinutes ,
            @rtrnHours ,
            @rtrnMinutes ,
            (other fields)
    end

close data;
deallocate data;
4

2 に答える 2

3

なぜそれを一括挿入して、選択で日付と時刻を変換しないのですか?

このようなもの:

INSERT other_tbl_name(raID, (other fields), Date_Out, Date_In, Time_Out, Time_In, (other fields))
select 
[raID],
(otherfields),
CAST([RA-rent-mm] as varchar(2)) + '/' + CAST([RA-rent-dd] as varchar(2)) + '/' + CAST([RA-Rent-CC] as varchar(2)) + CAST([RA-RENT-YY] as varchar(2)) [Date_Out],
CAST([RA-Rtrn-mm] as varchar(2)) + '/' + CAST([RA-Rtrn-dd] as varchar(2)) + '/' + CAST([RA-Rtrn-CC] as varchar(2)) + CAST([RA-Rtrn-YY] as varchar(2)) [Date_In],
CONVERT(varchar(15),DATEADD(minute, [RA-RENTAL-Minutes], DATEADD(hour, [RA-RENTAL-HOURS], '00:00')), 100) as [Time_out],
CONVERT(varchar(15),DATEADD(minute, [RA-RTRN-MINUTES], DATEADD(hour, [RA-RTRN-HOURS], '00:00')), 100) as [Time_in],
(other fields)
from table_name
where Transfered is null
and [RA-rtrn-mm] != 0

UPDATE Capture.icokc_data
SET Transfered = 1
WHERE [raID] IN
(
select 
[raID]
from table_name
where Transfered is null
-- and [RA-rtrn-mm] != 0  -- not sure about this one
)
于 2012-09-13T07:07:29.910 に答える
2

これは直接変換、つまり1つのレコード入力と1つのレコード出力であるため、1回の挿入クエリで実行できなかった理由はわかりません。

とにかく、動的にクエリを作成しないでください。動的クエリは、反復ごとに解析および計画されます。これが、ほとんどのパフォーマンスの問題の原因である可能性があります。

たとえば、次の代わりに:

declare @update as varchar(max) = '
UPDATE Capture.icokc_data
SET Transfered = 1
WHERE [raID] = '+cast(@raID as varchar(10))

exec(@update)

ただ行う:

UPDATE Capture.icokc_data
SET Transfered = 1
WHERE [raID] = @raID
于 2012-09-13T00:57:40.610 に答える