0
カーソルを使用せずに実装する必要があります。下のスクリプトはカーソルを使用しており、140kレコードでは5時間かかります。 SQL Serverのパフォーマンスを向上させる方法は?SQLサーバでカーソルの代替クエリを書く方法
には100,000以上のレコードがあります。
SET NOCOUNT ON
CREATE TABLE #temp (
RecordID int identity,
Address varchar(50),
City varchar(30),
State varchar(5),
GPSLat numeric(9,6),
GPSLong numeric(9,6),
MapURL varchar(255))
INSERT INTO #temp (Address, City, State)
VALUES ('1033 Southwest 152nd Street', 'Burien', 'WA')
INSERT INTO #temp (Address, City, State)
VALUES ('11910 Northeast 154th Street', 'Brush Prairie', 'WA')
INSERT INTO #temp (Address, City, State)
VALUES ('500 SeaWorld Drive', 'San Diego', 'CA')
INSERT INTO #temp (Address, City, State)
VALUES ('1 Legoland Drive', 'Carlsbad', 'CA')
DECLARE curGeo CURSOR LOCAL STATIC FOR
SELECT RecordID, Address, City, State
FROM #temp
DECLARE @RecordID int
DECLARE @Address varchar(50)
DECLARE @City varchar(30)
DECLARE @State varchar(5)
DECLARE @GPSLatitude numeric(9, 6)
DECLARE @GPSLongitude numeric(9, 6)
DECLARE @MapURL varchar(255)
OPEN curGeo
FETCH curGeo INTO
@RecordID,
@Address,
@City,
@State
WHILE @@FETCH_STATUS = 0 BEGIN
BEGIN TRY
EXEC opsstream.sputilGeocode
@Address = @Address OUTPUT,
@City = @City OUTPUT,
@State = @State OUTPUT,
@GPSLatitude = @GPSLatitude OUTPUT,
@GPSLongitude = @GPSLongitude OUTPUT,
@MapURL = @MapURL OUTPUT
UPDATE #temp
SET
GPSLat = @GPSLatitude,
GPSLong = @GPSLongitude,
MapURL = @MapURL
WHERE
RecordID = @RecordID
END TRY
BEGIN CATCH
PRINT 'Warning: RecordID ' + CAST(@RecordID AS varchar(100)) + ' could not be geocoded.'
END CATCH
FETCH curGeo INTO
@RecordID,
@Address,
@City,
@State
END
SELECT * FROM #temp
カーソルを取り除くには、一度に1つずつではなく、一度にテーブル内のすべてのアドレスを処理できるopsstream.sputilGeocodeのバージョンを作成する必要があります。テーブル値のパラメータを使用すると、その点で役立ちます。 –