Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = db
.CommandText = "SELECT @date = '2019-01-01'"
.Parameters.Append(.CreateParameter("@date", adDBDate, adParamOutput))
.Execute
End With
给......
必须声明标量变量“ @date”。
为什么我不能在查询文本中访问输出参数?
答案 0 :(得分:1)
该错误来自T-SQL,因为尚未声明变量@date
。
调整要传递给ADODB.Command
的T-SQL字符串以声明变量;
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = db
.CommandText = "DECLARE @date AS DATETIME; SELECT @date = '2019-01-01';"
.Parameters.Append(.CreateParameter("@date", adDBDate, adParamOutput))
.Execute
End With
调试这些类型问题的一种简单方法是使用SQL Server Management Studio运行原始查询。
SELECT @date = '2019-01-01'
如果您尝试在没有声明的情况下运行查询,您将遇到同样的错误,但有更多详细信息。
Msg 137, Level 15, State 1, Line 1
Must declare the scalar variable "@date".
答案 1 :(得分:1)
只有提供者支持时,命名参数才能在两侧(服务器:SQL Server,客户端:ADODB和VBScript)正常工作。对于SQL Server提供程序,只有配置为使用命名参数(其中cmd.CommandType
设置adCmdStoredProc
和cmd.NamedParameters
设置True
)调用存储过程的命令才支持。
对于像您这样的普通命令,服务器无法识别命名参数,只有?
占位符在查询中被识别为参数。
因此,您应该尝试以下操作。
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = db
.CommandText = "SELECT ? = '2019-01-01'"
.Parameters.Append(.CreateParameter("@dummyForServerNotForClient", adDBDate, adParamOutput))
.Execute
' must print: 2019-01-01
Response.Write .Parameters("@dummyForServerNotForClient").Value
End With
由于服务器忽略了参数名称,因此您可以省略参数名称来编写相同的代码,并通过使用其在集合中的顺序位置来访问参数的值。恕我直言,由于缺少显式命名的参数,因此代码变得更具逻辑性和可读性。
Set cmd = Server.CreateObject("ADODB.Command")
With cmd
.ActiveConnection = db
.CommandText = "SELECT ? = '2019-01-01'"
.Parameters.Append(.CreateParameter(, adDBDate, adParamOutput))
.Execute
' also must print: 2019-01-01
Response.Write .Parameters(0).Value
End With
我希望这可以帮助您理解概念。