在 sql 和 pyodbc 中参数化 TOP 值
Parametrizing TOP value in tsql and pyodbc
我尝试参数化要从 table 获得的顶行数。
我用
试过了
db.cursor.execute(
'''
SELECT TOP ? VALUE FROM mytable
WHERE param = ?
''',
top_value, param
)
它显示
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17
for SQL Server][SQL Server]Incorrect syntax near '@P1'. (102)
(SQLExecDirectW)")
使用如下所示的字符串插值即可。
db.cursor.execute(
f'''
SELECT TOP {top_limit} VALUE FROM mytable
WHERE SITE_SK_FK = ?
''',
param
)
我需要将它作为参数传递,还是字符串插值就足够了?
只要 top_limit
是一个 int
,您就可以对 TOP 使用字符串格式(对 WHERE 使用适当的参数),因此 SQL 注入问题的危险很小.
您可以通过用括号将值括起来来参数化 top
:
DECLARE @Top int = 5;
With Tally(N) AS
(
SELECT ROW_NUMBER() OVER(ORDER BY @@SPID)
FROM sys.objects
)
-- This works just fine
SELECT TOP (@Top) N
FROM Tally;
-- This will raise an error: Incorrect syntax near '@Top'
SELECT TOP @Top N
FROM Tally;
应用于您发布的代码:
SELECT TOP (?) VALUE
FROM mytable
WHERE param = ?
我尝试参数化要从 table 获得的顶行数。
我用
试过了db.cursor.execute(
'''
SELECT TOP ? VALUE FROM mytable
WHERE param = ?
''',
top_value, param
)
它显示
pyodbc.ProgrammingError: ('42000', "[42000] [Microsoft][ODBC Driver 17 for SQL Server][SQL Server]Incorrect syntax near '@P1'. (102) (SQLExecDirectW)")
使用如下所示的字符串插值即可。
db.cursor.execute(
f'''
SELECT TOP {top_limit} VALUE FROM mytable
WHERE SITE_SK_FK = ?
''',
param
)
我需要将它作为参数传递,还是字符串插值就足够了?
只要 top_limit
是一个 int
,您就可以对 TOP 使用字符串格式(对 WHERE 使用适当的参数),因此 SQL 注入问题的危险很小.
您可以通过用括号将值括起来来参数化 top
:
DECLARE @Top int = 5;
With Tally(N) AS
(
SELECT ROW_NUMBER() OVER(ORDER BY @@SPID)
FROM sys.objects
)
-- This works just fine
SELECT TOP (@Top) N
FROM Tally;
-- This will raise an error: Incorrect syntax near '@Top'
SELECT TOP @Top N
FROM Tally;
应用于您发布的代码:
SELECT TOP (?) VALUE
FROM mytable
WHERE param = ?