使用 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
我有一个存储的 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