代码之家  ›  专栏  ›  技术社区  ›  JoshGoodnow

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

  •  1
  • JoshGoodnow  · 技术社区  · 8 年前

    我有一个要概括的存储SQL过程。这涉及将表名、开始时间和结束时间作为变量传递,因此不必每次都编辑过程。我试图使用基本python变量来提示用户。(开始=int(输入(“输入开始时间:”)) 我只是没有找到一个简单的方法来做到这一点。我使用了“execute sp\u execute\u external\u scripts”,并一直在研究Pyodbc是否是实现这一点的合适工具,但迄今为止还没有任何效果,而且我还没有完全理解创建包装器的MS文档/教程。那么,提示用户输入可以作为变量注入过程的输入的最简单方法是什么呢?我觉得我错过了一些非常简单的事情。

    阅读这里的评论后,我原来的方法是overbroad,需要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
    
    3 回复  |  直到 8 年前
        1
  •  0
  •   David Browne - Microsoft    8 年前

    存储过程应类似于:

    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
    
        2
  •  0
  •   Yuri Molodyko    8 年前

    也许您需要python:

    Start = int(input("Enter Start Time: "))
    sql = 'exec UserInput @start =?'
    cursor.execute(sql, Start)
    cursor.commit()
    
        3
  •  0
  •   Gord Thompson    8 年前

    如果您真的想创建表名 动态 那么你需要使用 动态结构化查询语言 ,例如:

    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