日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網為廣大站長提供免費收錄網站服務,提交前請做好本站友鏈:【 網站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(50元/站),

點擊這里在線咨詢客服
新站提交
  • 網站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會員:747

本文介紹了使用觸發器的單次插入/單次觸發在SQL Server表中插入多行的處理方法,對大家解決問題具有一定的參考價值,需要的朋友們下面隨著小編來一起學習吧!

問題描述

我想要什么

能夠使用Python在SQL Server中將多行插入到表中,并且僅在插入所有行后才觸發INSTEAD OF INSERT觸發器。

背景

我的表上有一個INSTEAD OF INSERT觸發器,它對以前看不到的數據執行操作。

通常的操作模式是定期一次插入多行。

當我從python插入(使用pyodbc)時,如果我使用:

cursor.executemany('INSERT INTO table_name VALUE (?, ?, ...)', list_of_lists)

觸發器將針對每一行觸發–這不是我想要的。

我當前正在使用:

sql = 'INSERT INTO table_name VALUES (...),(...)...;'  # string built with format-strings
cursor.execute(sql)

這在理論上為我打開了SQL注入的大門,但我的環境受到了限制,因此實際上不是問題。
另外,我不知道查詢字符串的最大限制是多少。
我嘗試使用the method in this post找出極限,但返回的結果為空。所以我不確定是沒有限制還是未知。

我一次插入的行數預計不會太多(不超過1-2k行,少量列)。因此,我不認為我會達到極限,但我不想稍后感到驚訝。

然后是BULK INSERT選項和FIRE_TRIGGERS選項,但這需要將我的數據作為文件上載到運行SQL Server的計算機。這是我希望避免的復雜性。

有沒有更好的選擇,或者我當前的解決方案還行嗎?

推薦答案

似乎可以使用表類型參數來執行此操作。我要指出的是,我的Python不是很好,所以我不知道您是否可以在不使用的情況下使用存儲過程完成此。

不管怎樣,首先讓我們創建一個示例表:

CREATE TABLE dbo.SomeTable (ID int IDENTITY(1,1),
                            SomeString varchar(10),
                            SomeInt int,
                            SomeDate date,
                            SomeGUID uniqueidentifier);
GO

,然后是一個示例類型。我有意省略SomeGUID

CREATE TYPE dbo.SomeType AS table (SomeString varchar(10),
                                   SomeInt int,
                                   SomeDate date);

然后,您需要創建一個接受上述TYPE作為參數的過程。在下面的代碼中,我為SomeGUID定義了整個數據集的靜態值,以演示在對最終結果集中的proc的一次調用中插入所有行:

CREATE OR ALTER PROC dbo.SomeProc @SomeData dbo.SomeType READONLY AS
BEGIN

    DECLARE @UID uniqueidentifier = NEWID();
    
    INSERT INTO dbo.SomeTable (SomeString, SomeInt, SomeDate, SomeGUID)
    SELECT SomeString,
           SomeInt,
           SomeDate,
           @UID
    FROM @SomeData;
END;
GO

現在是蟒蛇。為此,我編寫了下面的簡單腳本,參考this answer以獲得一些幫助。我已經包含了完整的工作解決方案的整個腳本,但顯然有些腳本不適用于您的腳本,并且您可能沒有使用環境文件:

#!/usr/bin/env python3
#Import the bare minimums for this to work
import pyodbc, os
from dotenv import load_dotenv

#Get the details from my environemental file
load_dotenv()
SQLServer = os.getenv('SQL_SERVER')
SQLDatabase = os.getenv('SQL_DATABASE')
SQLLogin = os.getenv('SQL_LOGIN')
SQLPassword = os.getenv('SQL_PASSWORD')

#Create the full connection string
SQLConnString = 'Driver={ODBC Driver 17 for SQL Server};Server=' + SQLServer + ';Database=' + SQLDatabase + ';UID='+ SQLLogin +';PWD=' + SQLPassword

#Define the data that is going to be inserted into the table.
MyData = [('abc',1,'20200527'),('def',2,'20210527')]
#Turn it into a tuple. explained in https://stackoverflow.com/a/61156422/2029983
params = (MyData,) 

#And then execute the procedure, passing params as the parameters; which is a table
with pyodbc.connect(SQLConnString,timeout=20) as sqlConn:
    with sqlConn.cursor() as cursor:
        cursor.execute('EXEC dbo.SomeProc ?;', params)
        sqlConn.commit()

然后,當我運行SELECT * FROM dbo.SomeTable時,我得到以下數據:

ID 字符串 SomeInt 某個日期 某些GUID
1 ABC 1 2020-05-27 945a3656-54ee-47a2-962c-7a34c7f50635
2 定義 2 2021-05-27 945a3656-54ee-47a2-962c-7a34c7f50635

這篇關于使用觸發器的單次插入/單次觸發在SQL Server表中插入多行的文章就介紹到這了,希望我們推薦的答案對大家有所幫助,

分享到:
標簽:errorInsertmultiplerowsinSQLServertablewithsingleINSERT/singletrigg
用戶無頭像

網友整理

注冊時間:

網站:5 個   小程序:0 個  文章:12 篇

  • 51998

    網站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會員

趕快注冊賬號,推廣您的網站吧!
最新入駐小程序

數獨大挑戰2018-06-03

數獨一種數學游戲,玩家需要根據9

答題星2018-06-03

您可以通過答題星輕松地創建試卷

全階人生考試2018-06-03

各種考試題,題庫,初中,高中,大學四六

運動步數有氧達人2018-06-03

記錄運動步數,積累氧氣值。還可偷

每日養生app2018-06-03

每日養生,天天健康

體育訓練成績評定2018-06-03

通用課目體育訓練成績評定