我尝试对要从表中获取的前几行进行参数化。
我尝试过
db.cursor.execute(
'''
SELECT TOP ? VALUE FROM mytable
WHERE param = ?
''',
top_value, param
)
它显示了
pyodbc.ProgrammingError :(“ 42000”,“ [42000] [Microsoft] [ODBC驱动程序17 for SQL Server] [SQL Server]“ @ P1”附近的语法不正确。 (102) (SQLExecDirectW)“)
像波纹管一样进行字符串插值。
db.cursor.execute(
f'''
SELECT TOP {top_limit} VALUE FROM mytable
WHERE SITE_SK_FK = ?
''',
param
)
我需要将其作为参数传递,还是字符串插值足够好?
答案 0 :(得分:1)
您可以通过用括号括起来的值来对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 = ?
答案 1 :(得分:0)
只要top_limit
是int
,就可以对TOP使用字符串格式(对于WHERE使用适当的参数),因此几乎没有SQL注入问题的危险。