Iterate Over a List of Dates using a Numbers table in SQL

Gần đây tôi đã giúp Steve lưu trữ một loạt dữ liệu từ một trong các bảng của ông. Thật không may là ông đã không có một tấn diskspace để sử dụng một số các kỹ thuật tôi bình thường sẽ. Steve gần đây đã đăng một giải pháp bằng cách sử dụng PowerShell để làm điều này. Tôi nói với anh ta về một cách dễ dàng để làm điều này bằng cách sử dụng một con trỏ và một bảng số và ông nói với tôi để viết blog. Đây là một cách tuyệt vời để sử dụng một bảng số nếu bạn không có trong số này trong cơ sở dữ liệu của bạn, bạn nên tạo một bảng.

Đây là một kịch bản để tạo ra một bảng số.

CREATE TABLE dbo.Numbers (Số int IDENTITY (1, 1) PRIMARY KEY) GO khai báo @MaxNumber int set @MaxNumber = 65535 WHILE 1 = 1 BEGIN INSERT INTO dbo.Numbers Giá trị DEFAULT IF range_identity () = @MaxNumber BEGIN BREAK END END ĐI
Vì vậy, về cơ bản Steve muốn xóa tất cả dữ liệu ra khỏi bảng một ngày tại một thời điểm cho một phạm vi ngày và sau đó thu nhỏ đăng nhập để tránh. Cách đơn giản nhất tôi có thể nghĩ đến để làm điều này là tạo ra một con trỏ của tất cả các ngày tháng trong phạm vi ngày đó và sau đó lặp lại chúng. Chú ý tham gia vào bảng số cho tất cả các Số giữa 0 và ngày tháng của ngày bắt đầu và ngày kết thúc. Đây là mã …

khai báo @startdate datetime khai báo @enddate datetime – Khai báo các ngày thiết lập @startdate = ’01 / 01/2007 ‘set @enddate = ’10 / 01/2007’ khai báo @data datetime khai báo con trỏ datecursor forward_only cho Dateadd (d, Number , @ begindate) từ Numbers trong đó Number <= datediff (d, @startdate, @enddate) thứ tự bởi Số datecursor mở trong khi (1 = 1) bắt đầu tìm nạp tiếp theo từ datecursor vào @ thời gian nếu @@ fetch_status <> 0 phá vỡ; DELETE các số liệu thống kê WHERE period = @Period BACKUP LOG stats VỚI NO_LOG DBCC SHRINKFILE (stats_log, 2) kết thúc dateccess dở bỏ datecursor

Recent Posts

Recent Comments

    Archives

    Categories

    Meta