You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

无法将labNumber传入SQL查询的技术问题求助

问题:存储过程调用时参数传入报错"not enough arguments for format string"

_labNumber变量无法传入SQL查询方法,同类其他方法均可正常运行。已确认变量赋值正确,调用时用try-catch块包裹,报错信息为An error occurred: not enough arguments for format string。

调用代码

try:
    _comment = self.dataServices.GetComment(_labNumber)
    _value2 = self.dataServices.GetValue2(_labNumber)
    _value1 = self.dataServices.GetValue1(_labNumber)
    _results = self.dataServices.getResults(_labNumber)
except AttributeError:
    _comment = None
    _value2 = None
    _value1 = None
    _results = None

数据查询类方法示例(GetValue2)

def GetValue2(self, _LabNumber):
    _LabNumberStr = str(_LabNumber)
    try:
        with connection.cursor() as _cursor:
            _cursor.execute("{CALL dbo.uspShireXGetValue2(%s)}", [_LabNumberStr])
            row = _cursor.fetchone()
            if row:
                return {'VALUE2': row[0]}#21
            else:
                return {'VALUE2': None}
    except Exception as e:
        # Handle or log the exception as appropriate
        print(f"An error occurred: {e}")
        return {'VALUE2': None}

已验证正常的存储过程(硬编码参数可返回数据)

@LabNumber VARCHAR(10)
AS

SET NOCOUNT ON
SELECT
    WDR.COMMENT
FROM dbo.DNA_WORKSHEET_DET WD
INNER JOIN dbo.DNA_WORKSHEET W ON WD.WORKSHEET = W.WORKSHEET
LEFT OUTER JOIN dbo.DNA_TEST T ON W.TEST = T.TEST
LEFT OUTER JOIN dbo.DNA_LAB_TEST LT ON WD.LABNO = LT.LABNO AND W.TEST = LT.TEST
LEFT OUTER JOIN dbo.DNA_WORKSHEET_DET_RESULT WDR ON WD.WORKSHEET = WDR.WORKSHEET AND WD.LANE = WDR.LANE
WHERE WD.LABNO = @LabNumber
return

完整堆栈追踪

None
[28/Feb/2024 11:12:13] "GET /Molecular/SolidCancer/?csrfmiddlewaretoken=8hPU3Tfu7mwUNfvNfQSWMYjwy2jEldjJsUh8MUMQ0kT1nmNixlLhkqMOqJmLsV0f&txtCriteriaDateFrom=2019-12-30&txtCriteriaDateTo=2024-03-29&ddlCriteriaStatus=NOTFINAL&txtCriteriaLabnumber=&txtCriteriaLastname=&ddlCriteriaPriority=&ddlCriteriaDiseaseIndication1=&ddlCriteriaDiseaseIndication2=&ddlCriteriaDiseaseIndication3=&ddlAlertCriteria=False&ddlCriteriaReasonForDiseaseIndication1=&ddlCriteriaReasonForDiseaseIndication2=&ddlCriteriaReasonForDiseaseIndication3=&txtPageNumber=1&ddlCriteriaNoResult=0&ddlCriteriaItemsPerPage=20&btnSubmit=Search HTTP/1.1" 200 175938
[28/Feb/2024 11:12:14] "GET /static/Styles.css HTTP/1.1" 404 179
[28/Feb/2024 11:12:14] "GET /static/Scripts.js HTTP/1.1" 404 179
[28/Feb/2024 11:12:14] "GET /static/js/Scripts.js HTTP/1.1" 404 179

解决方案

核心原因

报错是因为Python将SQL语句中的%s识别为自身的字符串格式化符号,而非数据库参数占位符,导致传参时格式不匹配。

修正步骤

  1. 更换占位符格式
    若使用pymssql等驱动,调用存储过程需用?作为占位符,同时用元组传递参数(部分驱动对元组支持更稳定):

    _cursor.execute("{CALL dbo.uspShireXGetValue2(?)}", (_LabNumberStr,))
    
  2. 使用命名参数(推荐)
    直接对应存储过程的参数名,避免占位符混淆:

    _cursor.execute("{CALL dbo.uspShireXGetValue2(@LabNumber)}", {'LabNumber': _LabNumberStr})
    
  3. 排查参数有效性
    在方法开头添加打印日志,确认传入的_LabNumber无空值或异常格式:

    def GetValue2(self, _LabNumber):
        print(f"当前传入的LabNumber: {_LabNumber}")
        _LabNumberStr = str(_LabNumber)
        # 后续代码...
    
  4. 对齐同类方法的写法
    对比其他正常运行的查询方法,统一execute语句的占位符和传参方式,避免不一致导致的问题。


内容的提问来源于stack exchange,提问作者VultureInAtom05

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.28 21:37:42