在tsql和pyodbc中参数化TOP值

时间:2019-05-14 14:13:15

标签: python tsql pyodbc

我尝试对要从表中获取的前几行进行参数化。

我尝试过

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
    )

我需要将其作为参数传递,还是字符串插值足够好?

2 个答案:

答案 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_limitint,就可以对TOP使用字符串格式(对于WHERE使用适当的参数),因此几乎没有SQL注入问题的危险。