我有一個需要使用 pyodbc 運行的帶有多個引數的查詢,但我遇到了問題。這是查詢的簡化版本,只有一個引數(我實際上有 6 個)
declare @alertTypeName nvarchar(255)
set @alertTypeName = ?
SELECT TOP 1 Id FROM AlertType WHERE Name = @alertTypeName
@alertTypeName 可以包含特殊字符,例如“Boli ?i D?un?tori”。當然,如果我直接在 SQL Server 中運行這個查詢,我會設定@alertTypeName = N'Boli ?i D?un?tori'. SELECT 不會回傳任何內容而不在文本前添加 N。我的問題是,如何將值作為引數發送到查詢中,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 可以有不同的值,所以我不能直接將它添加到查詢文本中。
uj5u.com熱心網友回復:
在 Python 3 中,所有字串都是 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 Server 將引數值解釋為 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 的正確值
uj5u.com熱心網友回復:
看來我的問題實際上是由代碼中的錯誤 if 條件引起的,而不是由 SQL 引起的。感謝大家的幫助。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/347870.html
標籤:Python sql sql-server 参数传递 数据库
