使用 Python 将变量插入 SQL 存储过程的最简单方法?

Simplest way to insert variables into SQL Stored Procedure using Python?

我有一个存储的 SQL 过程,我想概括一下。这涉及将 Table 名称、开始时间和结束时间作为变量传递,因此不必每次都编辑程序。我正在尝试使用基本 python 变量来提示用户。 (开始 = int(输入("Enter Start Time: ")) 我只是还没有找到一种简单的方法来做到这一点。我已经使用 'execute sp_execute_external_scripts' 并一直在查看 Pyodbc 是否是适合此目的的工具,但到目前为止没有任何效果,而且我没有完全理解用于创建包装器的 MS documentation/tutorial。那么提示用户输入可以作为变量注入到过程中的最简单方法是什么?我觉得我在这里遗漏了一些非常简单的东西。

在阅读此处的评论后,我原来的方法过于宽泛并且需要 dynamicsql,我并不自动反对,但为单个表创建过程似乎更安全。所以我应该只需要将 Start、End 和 ChunkSize 作为整数变量推送到过程中。

已解决:我通过使用 pyodbc 编写一个 python 小程序得到了想要的结果。感谢您的帮助和温和的推动,让我摆脱了最初的天真想法。

import pyodbc
connection = pyodbc.connect('Driver={SQL Server};'
                            'Server=CROWN;'
                            'Database=ControlInformation;'
                            'Trusted_Connection=yes;')


cursor = connection.cursor()

Start = int(input("Enter Start Time: "))
End = int(input("Enter End Time: "))
ChunkSize = int(input("Enter # of files to delete at once: "))
cursor.execute('exec PurgeCurrencyExchangeRates @start = %d, @end = %d, 
@ChunkSize = %d' %(Start, End, ChunkSize))
cursor.commit(), 
connection.close()

SQL 存储过程

CREATE PROCEDURE UserInput 
@r int = 1,
@Start bigint = 0, 
@End bigint = 0,
@TableName varchar(40) = 'CurrencyExchangeRates',
@ChunkSize int = 10000,
@ColumnName varchar(40) = 'Timestamp'

AS
BEGIN

SET NOCOUNT ON;

while @r > 0
    delete top(@ChunkSize)
        ControlInformation.dbo.@TableName
        where @ColumnName > @Start and @ColumnName < @End

    set @r = @@ROWCOUNT

也许您需要 python:

Start = int(input("Enter Start Time: "))
sql = 'exec UserInput @start =?'
cursor.execute(sql, Start)
cursor.commit()

存储过程应该是这样的:

use CurrencyExchangeRates
go
CREATE PROCEDURE PurgeCurrencyExchangeRates 
@Start bigint = 0, 
@End bigint = 0,
@ChunkSize int = 10000
AS
BEGIN
    SET NOCOUNT ON;
    declare @r int = 1;


    while @r > 0
    begin
        delete top(@ChunkSize)
            from dbo.CurrencyExchangeRates
            where [Timestamp] >= @Start and [Timestamp] < @End

        set @r = @@ROWCOUNT
    end

end

如果你真的想让 table 名称 dynamic 那么你需要使用 dynamic SQL,像这样:

ALTER PROCEDURE DeleteFrom 
    @tableName sysname ='Table0'
AS
BEGIN
    SET NOCOUNT ON;
    DECLARE @sql nvarchar(4000);
    SET @sql = N'DELETE TOP (1) FROM ' + QUOTENAME(@tableName);
    EXEC(@sql);
END