无法访问命令文本中的输出变量

时间:2019-11-14 14:27:06

标签: tsql vbscript ado

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”。

为什么我不能在查询文本中访问输出参数?

2 个答案:

答案 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设置adCmdStoredProccmd.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

我希望这可以帮助您理解概念。