gpt4 book ai didi

sql-server - Excel 中的超时,在 SSMS 中立即执行

转载 作者:行者123 更新时间:2023-12-04 20:45:07 24 4
gpt4 key购买 nike

我在 excel 中有一个奇怪的问题,ADODB.Connection/Recordset .我必须承认我对 VBA/VB6 和 ADO 不是很熟悉。

我正在使用 excel-addin 中的函数从 SQL-Server 中的列返回价格。因此我调用一个标量值函数。这个函数需要三个参数,只有第一个是强制性的。如果我提供第二个 (datetime) 参数,我会得到一个超时错误。

这是完整的功能,尽管我认为它不相关:

Const connStr As String = "Connection-String"
Private conn As ADODB.Connection

Public Function GetClaimPriceByPartNumber(partNumber As String, Optional claimSubmittedDateEnd As String = "", Optional currencyName As String = "EUR") As String
If conn Is Nothing Then
Set conn = New ADODB.Connection
conn.ConnectionString = connStr
End If

If conn.State <> 1 Then conn.Open

If Trim(currencyName) = "" Then
currencyName = "EUR"
End If

If Trim(claimSubmittedDateEnd) = "" Then
claimSubmittedDateEnd = "NULL"
Else
claimSubmittedDateEnd = "CONVERT(DATETIME, '" & SQLDate(claimSubmittedDateEnd) & "', 102)"
End If

Dim str As String
str = "SELECT COALESCE([dbo].[_GetClaimPriceByPartNumber]('" & partNumber & "'," & claimSubmittedDateEnd & ",'" & currencyName & "'),-1)As Price"
' even a static datetime does not work: CONVERT(DATETIME, '2013-11-11', 102) '
On Error GoTo Exception
Dim rs As ADODB.Recordset
Set rs = New ADODB.Recordset
rs.Open str, conn, adOpenStatic, adLockReadOnly
On Error GoTo Exception

If rs.EOF Then
GetClaimPriceByPartNumber = "part not claimed or no price found"
Else
Dim price As Double
price = rs!price
If price < 0 Then
GetClaimPriceByPartNumber = "N/A"
Else
GetClaimPriceByPartNumber = Round(price, 2)
End If
End If

Escape:
If Not rs Is Nothing Then
If rs.State = adStateOpen Then rs.Close
End If
Exit Function

Exception:
GetClaimPriceByPartNumber = Err.Description
End Function

我无法在 sql-server 中重现此超时。我已经使用分析器来查看使用了什么 sql。但即使这样,也会立即在 SSMS 中返回结果:
declare @p1 int
set @p1=NULL
declare @p3 int
set @p3=557064
declare @p4 int
set @p4=98305
declare @p5 int
set @p5=NULL
exec sp_cursoropen @p1 output,N'SELECT COALESCE([dbo].[_GetClaimPriceByPartNumber](''1271-4303'',CONVERT(DATETIME, ''2013-11-11'', 102),''EUR''),-1)As Price',@p3 output,@p4 output,@p5 output
select @p1, @p3, @p4, @p5

我可以发帖 _GetClaimPriceByPartNumber如果你认为这很重要。

我已经黔驴技穷了。也许你知道发生了什么或者我可以尝试/改进什么。

最佳答案

而不是使用 CONVERT 转换日期功能

 claimSubmittedDateEnd = "CONVERT(DATETIME, '" & SQLDate(claimSubmittedDateEnd) & "', 102)"

尝试将值作为文本传递给函数并让它处理转换。 Application.TextFormat可用于将日期格式化为 VBA 中的字符串。

关于sql-server - Excel 中的超时,在 SSMS 中立即执行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20375101/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com