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 引起的。谢谢大家的帮助。
我有一个包含多个参数的查询,我需要 运行 使用 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 引起的。谢谢大家的帮助。