在 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 = ?