pyodbc 将参数作为 nvarchar 发送

pyodbc send parameter as nvarchar

我有一个包含多个参数的查询,我需要 运行 使用 pyodbc,但我遇到了问题。 这是一个简化版的查询,只有一个参数(我其实有6个)

declare @alertTypeName nvarchar(255)
set @alertTypeName = ?
SELECT TOP 1 Id FROM AlertType WHERE Name = @alertTypeName

@alertTypeName 可以包含特殊字符,例如 'Boli şi Dăunători'。 当然,如果我直接在 SQL 服务器中 运行 这个查询,我会设置 @alertTypeName = N'Boli şi Dăunători'。如果不在文本前面添加 N,SELECT 不会 return 任何内容。 我的问题是,如何将值作为参数发送到 cursor.execute() 中的查询以便正确编码?

这是python我目前的代码(简化版):

query = textwrap.dedent(""" 
declare @alertTypeName nvarchar(255)
set @alertTypeName = ?
SELECT TOP 1 Id FROM AlertType WHERE Name = @alertTypeName
""")

[...]
alertTypeName = "Boli şi Dăunători"

[...]
    
paramValues = [syswinAlertId, code, alertTypeName, alertMessage, createdBy, modifiedBy]
cursor.execute(query, paramValues)

alertTypeName 根据某些条件可以有不同的值,所以我不能直接将它添加到查询文本中。

在 Python3 中,所有字符串都是 Unicode,因此如果您将字符串作为参数值传递,pyodbc 将以适当的格式将其中继到 ODBC 驱动程序管理器 (DM),以便将其识别为 Unicode。例如,如果我们启动 SQL Server Profiler 跟踪,然后 运行 此代码

cnxn = pyodbc.connect("DSN=mssqlLocal")
crsr = cnxn.cursor()
sql = "SELECT ? AS thing"
params = ("Boli şi Dăunători",)
result = crsr.execute(sql, params).fetchval()

我们会看到 SQL 服务器将参数值解释为 N'string'

declare @p1 int
set @p1=1
exec sp_prepexec @p1 output,N'@P1 nvarchar(34)',N'SELECT @P1 AS thing',N'Boli şi Dăunători'
select @p1

请注意,我们不需要 搞乱 .setencoding().setdecoding(); pyodbc 默认值对于 SQL Server

是正确的

看来我的问题实际上是由代码中的错误 if 条件引起的,而不是由 SQL 引起的。谢谢大家的帮助。