Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Làm thế nào để nâng cấp DataFrame của gấu trúc vào bảng Microsoft SQL Server?

Có hai tùy chọn:

  1. Sử dụng MERGE câu lệnh thay vì INSERT ... ON CONFLICT .
  2. Sử dụng UPDATE câu lệnh với JOIN , theo sau là INSERT có điều kiện .

Tài liệu T-SQL cho MERGE cho biết:

Mẹo về hiệu suất:Hành vi có điều kiện được mô tả cho câu lệnh MERGE hoạt động tốt nhất khi hai bảng có một hỗn hợp phức tạp của các đặc điểm phù hợp. Ví dụ:chèn một hàng nếu nó không tồn tại hoặc cập nhật một hàng nếu nó khớp. Khi chỉ cần cập nhật một bảng dựa trên các hàng của bảng khác, hãy cải thiện hiệu suất và khả năng mở rộng bằng các câu lệnh INSERT, UPDATE và DELETE cơ bản.

Trong nhiều trường hợp, việc sử dụng UPDATE riêng biệt sẽ nhanh hơn và ít phức tạp hơn và INSERT tuyên bố.

engine = sa.create_engine(
    connection_uri, fast_executemany=True, isolation_level="SERIALIZABLE"
)

with engine.begin() as conn:
    # step 0.0 - create test environment
    conn.execute(sa.text("DROP TABLE IF EXISTS main_table"))
    conn.execute(
        sa.text(
            "CREATE TABLE main_table (id int primary key, txt varchar(50))"
        )
    )
    conn.execute(
        sa.text(
            "INSERT INTO main_table (id, txt) VALUES (1, 'row 1 old text')"
        )
    )
    # step 0.1 - create DataFrame to UPSERT
    df = pd.DataFrame(
        [(2, "new row 2 text"), (1, "row 1 new text")], columns=["id", "txt"]
    )

    # step 1 - upload DataFrame to temporary table
    df.to_sql("#temp_table", conn, index=False, if_exists="replace")

    # step 2 - merge temp_table into main_table
    conn.execute(
        sa.text("""\
            UPDATE main SET main.txt = temp.txt
            FROM main_table main INNER JOIN #temp_table temp
                ON main.id = temp.id
            """
        )
    )
    conn.execute(
        sa.text("""\
            INSERT INTO main_table (id, txt) 
            SELECT id, txt FROM #temp_table
            WHERE id NOT IN (SELECT id FROM main_table) 
            """
        )
    )

    # step 3 - confirm results
    result = conn.execute(sa.text("SELECT * FROM main_table ORDER BY id")).fetchall()
    print(result)  # [(1, 'row 1 new text'), (2, 'new row 2 text')]



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Tôi có thể lấy tên của tất cả các bảng của cơ sở dữ liệu SQL Server trong ứng dụng C # không?

  2. Xác thực email TSQL (không có regex)

  3. SQL Server:Lỗi liên kết giao tiếp SSL yêu cầu (không nhận được gói)

  4. Cảnh báo tác nhân SQL Server

  5. Làm cách nào để tạo một bước trong SQL Server Agent Job sẽ chạy gói SSIS của tôi?